各种设计模式-原理-作用-适用场景总结 有更新!

  Bob

    首先回顾下面向对象的三个基本特征和五大基本原则

    三大特性是:封装,继承,多态  

    所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。

    所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

    所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

    五大基本原则 
    单一职责原则SRP(Single Responsibility Principle)
    是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

    开放封闭原则OCP(Open-Close Principle) 
    一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,
    那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。

    替换原则(the Liskov Substitution Principle LSP) 
    子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,
    也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

    依赖原则(the Dependency Inversion Principle DIP) 具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,
    这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到
    了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。

    接口分离原则(the Interface Segregation Principle ISP) 
    模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来

     

    策略模式Strategy, 封装变化点,用Context中的contextInterface()统一调用。

     

    策略模式

     

    单一职责原则,就一个类而言,应该只要一个引起它变化的因素

    开放-封闭原则,即对扩展是开放的,对更改是封闭的,不变化的部分进行封闭,变化的进行抽象

    依赖倒转原则,说白了就是应该针对接口编程。高层模块不应该依赖底层模块的实现,两个都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象

    里氏替换原则,子类必须能替换掉父类,即把子类把父类替换不会影响程序行为

     

    以下是学习过程中查询的资料,别人总结的资料,比较容易理解(站在各位巨人的肩膀上,望博主勿究)

    创建型
    抽象工厂模式 http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html
    工厂方法 http://www.cnblogs.com/java-my-life/archive/2012/03/25/2416227.html
    建造者模式  http://www.cnblogs.com/java-my-life/archive/2012/04/07/2433939.html
    原型模式 http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.html
    单态模式 http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html

    结构型
    适配器模式 http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html
    桥接模式 http://www.cnblogs.com/java-my-life/archive/2012/05/07/2480938.html
    组合模式 http://blog.csdn.net/jason0539/article/details/22642281
    外观模式 http://blog.csdn.net/jason0539/article/details/22775311
    装饰者模式 http://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html
    享元模式 http://www.cnblogs.com/java-my-life/archive/2012/04/26/2468499.html
    代理模式 http://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html

    行为型
    责任链模式 http://blog.csdn.net/zhouyong0/article/details/7909456
    命令模式 http://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html
    解释器模式 http://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html
    迭代模式 http://www.cnblogs.com/java-my-life/archive/2012/05/22/2511506.html
    中介者模式 http://blog.csdn.net/chenhuade85/article/details/8141831
    备忘录模式 http://www.cnblogs.com/java-my-life/archive/2012/06/06/2534942.html
    观察者模式 http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html
    状态模式 http://www.cnblogs.com/java-my-life/archive/2012/06/08/2538146.html
    策略模式 http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
    模板方法模式 http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html
    访问者模式 http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html

     


    如有疑问或同行交流欢迎加群讨论:铂金信息技术交流群 151258054