转载地址:
1.理论支持1:https://www.cnblogs.com/ygsworld/p/10647954.html
2.理论支持2:小菜编程成长记系列 - 伍迷 - 博客园
设计模式系列是参照IT前辈-程杰编写的《大话设计模式》的内容而来,由于其实现内容是按照依据.Net Framwork的C#来实现的,而我是搞C++,所以我想着用C++的知识将书上相应的例子来实现一遍,不过学习之前,得明确一下:
1.为了更好从实践的角度去理解面向对象语言,比面向过程语言的易维护,易复用,易扩展的优点;
2.为了在编写考虑自己在编写代码时,能够有一个良好的思路,如果设计架构,如果节省资源,如何避免错误等;
3.就像篮球运动员一样,在学习了运球,投篮,上篮之后,如果想更上一层楼,就得学习梦幻脚步,转身后仰,金鸡独立,45度打板等等,赢下一场篮球比赛需要很多的功夫,首先还是得提高自身的水平;
谨记:
1.勿滥用设计模式,不要为了用而用,需要用的时候采用,起到事半功倍的时候;
2.设计模式要和理论原理联系起来,多实践,多动手;
3.前辈原话:“学习设计模式重要的是,重要的是不论将来用不用到这些设计模式,而是通过学习设计模式让我们找到“封装变化”,“对象间松散耦合”,“针对接口编程”的感觉,从而设计出易维护,易扩展,易复用,灵活性好的程序。成为诗人后,可能不需要刻意按照某种模式去创作,但称为诗人前他们一定是认真研究过成百上千的唐诗宋词,古今民句。”
-Context(模式可适用的前提条件)
-Theme或Problem(在特定条件下要解决的目标问题)
-Solution(对目标问题求解过程中各种物理关系的记述)
“四人组(Gang of Four,GoF,分别是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides)”于1994年归纳发表了23种在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟。
创建型模式(关注对象的创建过程,对类的实例化过程进行抽象,描述如何将对象的创建和使用分离)
抽象工厂模式(Abstract Factory) ★★★★★https://blog.csdn.net/qq_22122811/article/details/144436871
建造者模式(Builder) ★★☆☆https://blog.csdn.net/qq_22122811/article/details/113887589
工厂方法模式(Factory Method) ★★★★★(GoF 之外:简单工厂模式):https://blog.csdn.net/qq_22122811/article/details/112363432
工厂方法模式-1https://blog.csdn.net/qq_22122811/article/details/113518112
原型模式(Prototype) ★★★☆☆https://blog.csdn.net/qq_22122811/article/details/113842717
单例模式(Singleton) ★★★★☆https://blog.csdn.net/qq_22122811/article/details/144410811
结构型模式(关注如何将现有类或对象组织在一起形成更加强大的结构)
适配器模式(Adapter) ★★★★☆
桥接模式(Bridge) ★★★☆☆
组合模式(Composite) ★★★★☆
装饰模式(Decorator) ★★★☆☆https://blog.csdn.net/qq_22122811/article/details/113180313
外观模式(Facade) ★★★★★https://blog.csdn.net/qq_22122811/article/details/113867438
享元模式(Flyweight) ★☆☆☆☆
代理模式(Proxy) ★★★★☆https://blog.csdn.net/qq_22122811/article/details/113248875
行为型模式(关注系统中对象间的交互,研究系统在运行时对象之间的相互通信与协作进一步明确对象的职责)
职责链模式(Chain of Responsibility) ★★☆☆☆https://blog.csdn.net/qq_22122811/article/details/145691508
命令模式(Command) ★★★★☆
解释器模式(Interpreter) ★☆☆☆☆
迭代器模式(Iterator) ★★★★★
中介者模式(Mediator) ★★☆☆☆
备忘录模式(Memento) ★★☆☆☆
观察者模式(Observer) ★★★★★https://blog.csdn.net/qq_22122811/article/details/144249907
状态模式(State) ★★★☆☆https://blog.csdn.net/qq_22122811/article/details/144544317
策略模式(Strategy) ★★★★☆ https://blog.csdn.net/qq_22122811/article/details/112377425
模板方法模式(Template Method) ★★★☆☆https://blog.csdn.net/qq_22122811/article/details/113867438
访问者模式(Visitor) ★☆☆☆☆
注:后面链接跟的是自己在学习《大话设计模式》后,用Qt creator 4.11.1,以及C++实现的,例子来源于《大话设计模式》;
1.单一职责原则(Single Responsibility Principle, SRP)| ★★★★☆ : 一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中
另一种定义方式:就一个类而言,应该仅有一个引起它变化的原因。简单而言,就是一个类如果职责越多,那么它被复用的可能性就越低。即这个类中一个职责变化,可能会影响到其他的职责的运作。因此,单一职责原则就是实现高内聚,低耦合,将一个类的职责降低到最小,即类的数目很多,类中职责很少,因而类被复用的可能性被提高。
2.开闭原则(Open-Closed Principle,OCP) | ★★★★★ : 软件实体应当对扩展开放,对修改关闭
开闭原则是复用设计的第一块基石。在软件实体中应在尽量不修改原有代码的情况下进行扩展
3.里氏代换原则(Liskov Substitution Principle,LSP)| ★★★★★ : 所有引用基类的地方必须能透明地使用其子类的对象
在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何的错误和异常,反之不成立。例如:我喜欢动物,那么我一定喜欢狗,因为狗是动物的子类,反之不成立
4.依赖倒转原则(Dependence Inversion Principle,DIP) | ★★★★★ : 高层模块不应该依赖低层模块,它们应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象
要针对接口编程,不针对实现编程。一个具体类应当只实现接口或抽象类中声明过的方法,而不给出多余的方法,否在无调用到在子类中增加的新方法
5.接口隔离原则(Interface Segregation Principle,ISP)| ★★☆☆☆ : 客户端不应该依赖那些它不需要的接口
当一个接口太大时,将它分割成一些更细小的接口,使用该接口的客户端只要知道与之相关的方法即可
6.合成复用原则(Composite Reuse Principle,CRP)| ★★★☆☆:优先使用对象组合,而不是继承来达到复用的目的
在一个新的对象里通过关联关系(包括组合和聚合关系)来使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用功能的目的
7.迪米特法则(Law of Demeter,LoD)| ★★★☆☆ : 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
又称最少知识原则,一个软件实体应尽可能少地与其他类发生相互作用
优点:
1.融合了众多专家的经验,并以一种标准的形式供广大开发人员所用
2.提供了一套通用的设计词汇和一种通用的语言,以方便开发人员之间进行沟通和交流,使得设计方案更加通俗易懂
3.让人们可以更加简单方便地复用成功的设计和体系结构
4.使得设计方案更加灵活,且易于修改
5.将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本
6.有助于初学者更深入地理解面向对象思想,方便阅读和学习现有类库与其他系统中的源代码,还可以提高软件的设计水平和代码质量
缺点:
要说缺点的话,每一种都有它适用的地方和不适用之处,若使用不当,缺点往往会暴露的很明显。因此,学习到位,理解透彻,运用的多了,自然懂得如何扬长避短了,因而模式的缺点就尽可能的最小化了