1、概念:策略模式定义了算法族,并将算法族封装起来,算法可以相互替换,算法的变动不会影响请求该算法的客户。
2、使用场景:
1)在不同类需要不同行为,或者不同类需要相同行为但行为表现(内容)不同时,可以使用strategy模式。需注意,在设计继承时需考虑是否使用策略模式,
尤其继承中有动态行为时。
2)根据不同的情况使用不同的策略,或者策略在未来还可能用其他方式实现。
3)对客户隐藏具体策略算法的实现细节。
3、补充:封装动态、多用组合少用继承、面向接口编程而不是面向对象编程。
二、观察者模式
1、概念:观察者模式定义了一系列对象之间的一对多关系,当一个对象状态发生变化时,将会通知依赖它的多个对象。
2、使用场景:
1)“推”或“拉”信息
2)触发其他对象方法
3)解耦存在关系的多个对象
3、补充:为实现有关系对象之间的松耦合而努力。
继承无法实现最有弹性和最好维护的设计,利用组合和委托可以实现在运行时具有集成行为的效果。利用继承设计子类的行为,是在编译时静态决定的,而且所有子类都会继承到相同的行为。利用组合的做法扩展对象的行为,可以在运行时动态的进行扩展。
三、装饰者模式
1、概念:动态的给一个对象添加一些额外的职责。
2、使用场景:
1)为某个现有对象动态增加一些功能或职责。
2)当某个对象的职责经常发生变化或经常需要动态的增加职责。
3、补充:类应该对扩展开放,对修改关闭。如果一段方法已经调试好,修改好bug。新的要求再去修改,则会导致产生新的问题。对扩展开放,可以在不修改代码的情况下就可以搭配新的行为,设计具有弹性,可以应对改变,可以接受新的功能来应对的需求。观察者模式可以在不修改代码的情况下扩展新的功能。开放-关闭原则应用在设计中最容易改变的地方。每个地方都采用开放-关闭原则是一种浪费,增加代码复杂度。
四、工厂方法模式
1、概念:工厂方法定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到了子类。
2、使用场景:
1)类不知道自己要创建的是哪一个对象。
2)类用子类创建对象。
3)将对象的创建和使用分离
3、补充:抽象倒置原则,要依赖抽象,不要依赖具体类。
五、抽象工厂模式
1、概念:提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
2、使用场景:
1)有关联的对象需要一起应用并且它们的关系是强迫的。
2)系统需要由多个关联的对象来组成。
3、补充:工厂方法模式隐藏在抽象工厂模式中。
六、单例模式
1、概念:确保一个类只有一个实例,并且提供一个全局访问点。
七、命令模式
1、概念:将“请求”封装成对象。使用不同的请求、队列或日志来参数化其他对象。命令模式也可支持撤销操作。
2、使用场景:
1)命令模式与多个对象之间存在调用关系,封装调用方法即封装请求,隐藏具体实现,将命令者与执行者完全解耦
2)请求队列
3)实现日志和事务系统
3、补充:使用“聪明”命令对象,直接实现了请求,而不是将请求委托给接收者。但是调用者和接收者之间的解耦程度差,不能把接收者当作参数传递给命令。
八、适配器模式
1、概念:将一个接口,转换为客户所期望的接口,让原本不兼容的类合作无间。
2、使用场景:
九、外观模式
1、概念:定义了一个统一的接口,用来访问子系统中的一群接口,简化了子系统。
2、使用场景:
1)一个功能访问需要调用多个对象
2)客户端程序与多个子系统之间有很大的依赖性
3、补充:最少知识原则:只和你的密友交谈,减少对象之间的交互,只留几个‘密友’)。外观模式使得使用与子系统解耦。
十、模板模式
1、概念:在一个方法中定义了一个算法的骨架,并将一些步骤推迟到子类中。
2、使用场景:
1)不改变算法结构,重新定义算法中某些步骤
3、补充:好莱坞原则(不要调用(打电话给)我们,等我们调用(打电话给)你),减少对象之间的依赖腐败。