【设计模式】三大类:创建型模式、结构型模式、行为型模式
1 创建型模式
本人理解:以C++为例,创建对象时,用关键字new来创建(实例化)对象。用一个函数或类将new的过程封装起来,就是创建型模式。
《设计模式》中的描述:
创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。
一个类----创建型模式使用继承改变被实例化的类,
一个对象-创建型模式将实例化委托给另一个对象。
(看后,一头雾水)
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
2 结构型模式
本人理解:创建型模式关注一个类或对象的实例化;结构型模式关注多个类或对象组合成更复杂的对象,是为了更灵活的构造对象。
《设计模式》中的描述:结构性模式涉及到如何组合类和对象以获得更大的结构。
结构型类----模式采用继承机制来组合接口和实现。
结构型对象-模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。
(看后,一头雾水)
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
3 行为型模式
本人理解:上述两种模式都是出于一定目的(复用代码、修改时更灵活、容易维护等等)创建对象,对象之间一通信,一个程序就跑起来啦,把对象之间通信这部分,再总结总结,起个名字,就叫“行为型模式”。
《设计模式》中的描述:行为模式涉及到算法和对象间职责的分配。
行为模式不仅描述对象和类的模式,还描述它们之间的通信模式。
行为模式使用继承机制在类间分派行为。(还是一头雾水)
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
各个模式之间的关系图
参见《设计模式》第8页
设计模式的六大原则
1、开闭原则(Open Close Principle)
本人理解:增加新功能时,重新定义一个接口(开),不要修改原来的接口(闭)(为了向下兼容,如果修改了,可能对已经使用这个接口的代码造成影响)。
开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。
2、里氏代换原则(Liskov Substitution Principle)
本人理解:子类包括基类的全部功能。
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversion Principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。
5、迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承
相关文章:

单机训练速度提升高达640倍,快手开发GPU广告模型训练平台
作者|廉相如(快手FeDA智能决策实验室 )如何有效处理大规模用户数据进行广告推荐?对于互联网企业的发展和进步至关重要。这也是为何快手成立西雅图实验室并实现新一代GPU广告模型训练平台的原因之一。快手新创建的“Persia”GPU广告…

比特币SPV节点启动流程图
2019独角兽企业重金招聘Python工程师标准>>> 比特币SPV节点启动流程图 图小点击右键在新窗口打开 转载于:https://my.oschina.net/penghaozhong/blog/1924687

Android中后台定时任务实现,即时数据同步问题思考!
为什么80%的码农都做不了架构师?>>> 如果你正在找Android后台定时任务实现,那么你找对了,但是其实如果你正在找Java后台任务实现,你就不会找到我的这个博客了.但是我的实现方式没有使用多少Android相关的东西.确实.但是如果你进来了,Thank you!你还是会…

面对996,程序员如何利用“碎片时间”涨薪?
图片来源|视觉中国作为一个程序员,需要不断学习更新知识技能来提升自己。但爆炸式的信息量,总使人抓不到学习重点。所以,笔者为大家筛选了几个程序员会阅读的小众公众号,覆盖全面,囊括了不同的技术类别。小道消息&…

JakartaEE Exception: Invalid bound statement (not found): com.mazaiting.blog.dao.UserDao.selectUs...
异常 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.mazaiting.blog.dao.UserDao.selectUserByNameat org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:227) ~[mybatis-3.4.6.jar:3.4.6]at org.a…

【Qt】AVFrame转QImage
FFmpeg的AVFrame转成Qt的QImage //头文件 #ifdef __cplusplus extern "C" {#endif #include <libavcodec/avcodec.h> #include <libavcodec/avformat.h>

C# 回发或回调参数无效
回发或回调参数无效。在配置中使用 <pages enableEventValidation"true"/> 或在页面中使用<% Page EnableEventValidation"true" %> 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务…

【QT】Qt正则表达式的使用:使用QRegExp来限制QLineEdit的输入格式
QLineEdit中使用QRegExp来限制输入格式,下面以IP输入框为例 QLineEdit *lineEditIP = new QLineEdit("192.168.147.200", this);QRegExpValidator *reg = new QRegExpValidator(GW::RegExp::ipRegExp(), this)

小小的Python编程故事
现在Python的火热已经不是整个编程界的事情了,Python的火热已经蔓延到小学、大学课程,之前看新闻报道说青岛的小学生课程里都开始设置Python的课程了,大学里由原来必考的VB也改成了Python。一时大家都掀起了学习了Python的热潮,而…

python 验证码识别示例(二) 复杂验证码识别
在这篇博文中手把手教你如何去分割验证,然后进行识别。 一:下载验证码 验证码分析,图片上有折线,验证码有数字,有英文字母大小写,分类的时候需要更多的样本,验证码的字母是彩色的,图…

★核心关注点_《信息系统项目管理师考试考点分析与真题详解》
★核心关注点_《信息系统项目管理师考试考点分析与真题详解》真诚感谢你选用《信息系统项目管理师考试考点分析与真题详解》作为高级项管的辅导用书。对于使用该书的读者们,在备考2012.5.26信息系统项目管理师考试之下午案例分析和论文写作考试时,以下一…

告别低分辨率网络,微软提出高分辨率深度神经网络HRNet | CVPR 2019
来源 | 微软研究院AI头条(ID:MSRAsia)作者简介:孙可,中国科学技术大学信息学院在读博士生,目前在微软亚洲研究院视觉计算组实习,导师是王井东和肖斌老师。他的研究兴趣包括人体姿态估计、语义分…

sudo提权实战讲解 对用户对组的权限配置分析
Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过useradd创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限执行。 sudo就是来解决这个需求的: 这些非root用户不需要知道root的密码,就可以…

【Qt】在Ubuntu16.04中安装QSerialPort模块
1、问题描述 在pro中添加:QT serialport 编译时报错:Project ERROR Unknown module(s) in QT:serialport 2、解决方法 安装QSerialPort模块库 sudo apt-get install libqt5serialport5-dev

Velocity文档(3)
2019独角兽企业重金招聘Python工程师标准>>> velocity.properties 的一些配置项 velocimcro.library属性:指定自己的模板库,多个模板库以逗号分隔。默认情况下,velocity查找唯一的一个库:VM_global_library.vmvelocima…

Java 24岁!Google加持的Kotlin真能取代它?
作者 | 屠敏出品 | CSDN(ID:CSDNnews)1995 年 5 月 23 日,Sun 公司在 Sun world 会议上正式宣布了 Java 的到来,从此一代编程语言界的翘楚就此诞生。而在不断地迭代与适配中,今时今日,Java 以需…

三,ES6中需要注意的特性(重要)
-----书接上文,前文中我们总结了关于JS的组成部分以及如何快速开展学习JS,相信已经有很多朋友掌握到这些方法。接下来就从更深的ECMAScript开始说起。 1.什么是ES6? ECMAScript(European Computer Manufacturers Association) 6: 是JavaScript语言的下一…

【SVN】在阿里云上创建svn服务器
1、创建用户及相关设置 阿里云搭建ubuntu18.04工作台,默认只有root超级用户。为了安全起见,我们使用普通用户来创建svn: useradd hello // 创建用户hello mkdir -p /home/hello // 在hello用户的根目录 cd /home/hello chown hello . // 设…

【转】on delete cascade
关系表的级联更新: on update cascade on delete cascade 是级联删除的意思 意思是 当你更新或删除主键表时,那么外键表也会跟随一起更新或删除 CREATE TABLE Countries(CountryId INT PRIMARY KEY) INSERT INTO Countries (CountryId) VALUES (1) INSER…

倒计时1天!CTA核心技术及应用峰会报名通道即将关闭(附参会攻略)
全球智能化趋势当前,人工智能技术正蓬勃发展。为了直击开发者在机器学习与人工智能技术研究与落地过程中的痛点与瓶颈,深入解析机器学习和知识图谱技术在行业中的实践和落地。2019 年 5 月 26 - 27 日,由中国 IT 社区 CSDN 与数字经济人才发展…

【Qt】在QtCreator中使用Ctrl+Shift+f快捷键打开高级查找窗口失效的解决方法
1、问题描述 Win10操作系统环境下,在QtCreator中使用Ctrl+Shift+f快捷键打开高级查找窗口失效。 2、原因分析 Ctrl+Shift+f快捷键在各种输入法中,常用来做中文简体和繁体输入的切换。QtCreator中该快捷键失效的的原因,多半是因为和输入法的快捷键冲突。可以在输入法的快捷…

Python修行之字符串(一):连接、切割、大小写、排版
字符串:1.是由一个个字符组成有序的序列,是字符的集合2.字符串是不可变对象3.使用单引号、双引号、三引号引住的字符序列4.python3中、字符串就是unicode类型、在2中分两种一种unicode一种非unicode字符串元素访问--下标:1.字符串支持使用索引访问2.有序的字符集合&…

UI自动化测试随笔
昨天给开发的同事讲我们正在做的自动化测试,同事问了句:为什么API的测试不需要写代码了,而UI的测试还需要写那么多代码呢? 能不写代码么? 目前我们的自动化测试的现状: 目前主要覆盖两个部分:A…

【跃迁之路】【554天】程序员高效学习方法论探索系列(实验阶段311-2018.08.13)...
(跃迁之路)专栏 【跃迁之路】奖励金计划正式开始 从2018.7.1起,【跃迁之路】奖励金计划正式起航,从今以后,, 每月1日,我会将自己个人上月收入的1%计入【跃迁之路】奖励金池,积累到足够金额后,将…

TensorFlow 2.0来了,为什么他却说“深度学习框架之争,现在谈结果为时尚早”?...
记者 | 琥珀出品 | AI科技大本营(ID:rgznai100)半个多世纪前,浙江大学老校长竺可桢曾有两个非常经典的教育问题:“诸位在校,有两个问题应该自己问问,第一,到浙大来做什么?第二&#…

【FFmpeg】ffmpeg工具源码分析(一):main函数
ffmpeg工具经常用来转换、生成媒体文件,下面是它的源码分析(一):main函数 ffmpeg版本:4.2.1 int main(int argc, char **argv) {int i, ret;BenchmarkTimeStamps ti; # 用于基准测试init_dynload(); # 初始化动态库加载路径,只在win3

Android之传感器(一)
传感器的种类:1. 动作传感器加速度传感器、重力传感器和陀螺仪(判断手机姿态)等2. 位置传感器方向传感器和磁力传感器3. 环境传感器温度传感器 、压力传感器和亮度传感器 使用传感器的方法:1. 获取SensorManager对象SensorManage…

【Qt】Qt单例模式三种实现
1、饿汉式 在头文件中:将构造函数私有化,并创建静态函数instance来获取实例 class A : public QObject {Q_OBJECT public:static A* instance(QObject *parent = nullptr);private:explicit A(QObject *parent = nullptr); }

程序员敲代码时,戴着耳机究竟在听什么?
今天,某妹子突然凑到我的耳边轻声说:“我们公司的程序员,清一色的戴着耳机,你说他们是不是故意不想听我们提的需求?”我很方,因为我也喜欢戴耳机。(思考ing)思考了一秒钟后ÿ…

关于Oracle.ManagedDataAccess数据库表加字段后,必须重启的问题
关于Oracle.ManagedDataAccess数据库表加字段后,必须重启的问题,解决方法如下:在数据库连接字串中,增加一个参数:Metadata Poolingfalse如“Data Source(DESCRIPTION(ADDRESS_LIST(ADDRESS(PROTOCOLTCP)(HOST1.1.6.200…