单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。

 

一、简单工厂模式(A)、工厂方法模式(B)。

A:简单工厂 B:工厂方法模式

ps:工厂方法模式 在 简单工厂模式 的基础上,把SimpleFactory类进行抽象分解成一个Factory父类和几个Factory子类,使工厂类更具扩展性。

对比之下,各有优劣:

1)在简单工厂模式下新增功能时,除了扩展新的功能类,还要修改SimpleFactory类,不需修改使用者的代码;

2)在工厂方法模式下新增功能时,除了扩展新的功能类和对应工厂类,还要修改使用者的代码。

 

ps: SimpleClass类 就像一所学校,负责培养拥有不同专业技能的毕业生,Client类(客户端)已经准备好相关职位等待毕业生入职。企业的职位缺人,就向学校要人,学校负责培养出合适的毕业生。

其核心思想重在把各个对象的生产权交给工厂,你要什么工厂就生产什么给你。

本质上,就是在 逻辑层 利用继承封装不同的对象,在 表现层 利用多态隔离功能变化带来的影响。

 

二、策略模式。

策略模式

ps:子类就是变化点(不同的对象/算法/业务),相对于简单工厂模式,去掉了工厂类,直接运用继承来封装不同的变化点,使用的时候运用多态来屏蔽变化点的差异。

其思想重在把变化点封装起来,以便可以互相更改替换,而不影响使用者。

本质上,就是在 逻辑层 利用继承封装不同的对象,在 表现层 利用多态隔离功能变化带来的影响。

 

三、开放-封闭原则:对软件实体(类、模块、函数等)应该可以扩展,但是不可以修改

    开放-封闭原则的意思是,设计的时候,时刻考虑,尽可能让这个类足够好,写好了就不要去修改,如果新需求来,增加一些类就完事了,原来的代码能不动则不动。但是无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化,遇到时,程序员应该构造抽象来隔离以后发生的同类变化。

    开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对每个部分都刻意地进行抽象是过犹不及的做法。

 

四、依赖倒置原则:A 高层模块不应该依赖底层模块,两个的都应该依赖抽象。B 抽象不应该依赖细节,细节应该依赖抽象

例如:

public class Driver implements IDriver { private ICar car; public Driver(ICar _car) { //ICar是抽象类,这里通过构造函数来接收所依赖的抽象 this.car = _car; } public void driver() { this.car.run();//这里依赖了抽象(car就是这个抽象) } }

五、里氏代换原则:子类型必须能够替换掉它们的父类型。(把父类替换成它的子类,程序行为没有变化。)

ps:  正是由于里氏代换原则 使得父类模块在无需修改的情况下就可以用子类进行扩展。

 

六、装饰模式。

装饰模式 使用聚合符号是为了应用多态针对抽象编程。

ps: Decorator及其子类 根据依赖倒置原则, 针对抽象(superclass)编程, 且 子类实现虚方法时在执行新功能的基础上, 别忘了 执行上一层(抽象)的功能,这样才能达到动态增加功能的效果。例如:把SubClassObj对象聚合到SubClassAddNew1对象, 然后把SubClassAddNew1对象聚合到SubClassAddNew2, 此时SubClassAddNew2就拥有前2者兼自己的Operation()功能。

其思想重在方便动态地给一个对象添加新功能而不影响旧功能的代码。

七、代理模式。

代理模式

ps: 有时候不允许 外界使用者 直接接触到 真实类对象,于是让 代理类 克隆了 真实类 的通用功能,但代理类就像一个缺魂的躯壳,当RealObj对象被传递到ProxyObj对象后,代理对象才真正能用。这样的好处是,真实类 从使用者手中脱离出来,代理类也做到了依赖抽象编程,必要时还可以增加额外功能,这就是代理作为分身(躯壳)的意义。

其思想重在为使用者提供一种代理以控制其对这个真实对象的访问。简之,控制访问。

 

八、原型模式。

原型模式

ps:ConcretePrototypeA 与 ConcretePrototypeB 没有必然的联系,唯一共同点就是继承了Clone()方法,表示他们都具有克隆自身的功能。

浅复制:实现Clone()函数时,对值类型的字段逐位复制,对引用类型的字段只复制地址;

深复制:实现Clone()函数时,对值类型的字段逐位复制,对需要的引用对象进行重新创建并用本地数据对其进行初始化。

其思想重在为复杂的对象提供方便的复制机制。

 

九、模板方法模式。

ps:定义一个骨架模板,用函数接口的形式开放骨架中的某些部位,使得子类只需重写相应的接口就可以达到修改模板实例的效果。

其思想重在把重复、不变行为的代码搬迁到单一的地方(父类),增加代码复用率。

 

十、外观模式/门面模式。

外观模式

ps:其思想重在为子系统的一组接口提供一个一致的界面,即为外界提供一个高层接口,通过这个接口来分派执行不同的功能。

1.设计初期,模块与模块之间应该建立外观模式,降低耦合度;

2.开发过程,系统细化逐渐复杂化,产生很多很小的类和方法,应用外观模式可以降低接口调用之间的复杂度。

2.维护阶段,如果系统扩展性差,不易维护,则可以用外观模式对旧系统进行提取一层简单的接口,在这层接口基础上去修改和扩展,而不必直接去修改,如下图:

旧系统1  --> 新系统 2

 

十一、建造者模式/生成器模式。

建造者模式

ps:主要用于创建一些复杂的对象,这些对象内部构建的建造顺序通常是稳定的,但对象内部的构建通常面临复杂的变化。将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示。

其思想重在把执行流程中的稳定步骤抽象出来,便于扩展出同类的对象。

十二、观察者模式/发布-订阅模式。

观察者模式 

ps:定义一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。当主题对象状态发生变化时,会通知到所有观察者。

当一个对象的改变需要同时改变多个对象的时候,而且它不知道有多少个对象等待改变,这时应该考虑使用观察者模式。

 

十三、

 

 

十四、

 

 

十五、

 

 

十六、