设计模式

什么是设计模式

设计模式是历经检验的OO设计经验。

设计原则

1.封装变化,将变化的部分取出并封装起来。在
设计系统时,预先考虑哪些地方蔚来可能需要变化,提前代码中加入这些弹性。
2.针对超类型(接口、抽象类)编程,而不是针对实现编程
3.多用组合,少用继承
通过组合建立的系统具有很大弹性,组合用于很多设计模式中
4.为了交互对象之间的松耦合设计而努力
5.类应该对扩展开放,对修改关闭
通过一些聪明的OO技巧允许在不修改原有代码的情况下进行功能扩展
遵循开放-关闭原则通常会引入新的抽象层次,增加代码的复杂度,每个地方都采用开放-关闭原则是一种浪费,也没必要,需要把经理集中在设计中最有可能改变的地方。

委托 组合

继承会导致的问题
1.运行时的行为不容易改变(动态的改变类的行为)
2.改变牵一发动全身,容易造成其他子类不想要的改变
组合/委托与继承的比较
组合/委托可用于在运行时动态加上新行为
利用组合和委托,利用继承设计子类,是在编译时静态决定的,而且所有子类都会继承相同的行为。如果能够利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。

常用设计模式

策略模式

定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

观察者模式

观察者模式定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它所有依赖着都会收到通知并自动更新。
观察者提供一种对象设计,让主题和观察者之间松耦合

观察者模式实现有推和拉两种方式,通常推荐使用推的方式

装饰器模式

装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案
装饰者的类型反映了它所装饰的对象,所以装饰器和被装饰对象具有相同的超类型。
decorator继承beverage是为了与具体对象类型(espresso、darkroaast)保持一致,而不是继承它的行为
如果依赖继承,那么类的行为只能是编译时静态决定,反之利用组合实现的装饰者可以在运行时增加对象行为
装饰者可以在所委托被装饰者的行为之前或之后加上自己的行为,以达到特定的目的
装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得复杂。