写在前面:阅读设计模式的时候或许会觉得许多设计模式都不过是多此一举,但如果站在自己是类库开发者为用户服务的角度想问题,将自己想象成用户,将自己置身于多人程序开发的场景,就能理解设计模式的好处了。
目的:
方法:创建Factory接口/抽象类,用户通过为Factory赋予不同的实现使不同的Factory返回不同的对象。
构造方式:
|用户| <—— | Target| |原类|
| 实现 | 继承或委托
————|Adapter|————
其他:类似Adapter。
目的:
方法:创建一个AbstractFactory的接口/抽象类,用户通过为AbstractFactory赋予不同的实现使不同的AbstractFactory返回不同且配套的工厂。
| Pizza|————————————
| 实现 | 继承
|ConcretePizza| | Decorator|Pizza pizza|construct(pizza) add()|
|
|TopA|——————————|TopB|
其他:类似Decorator。
目的:
方法:创建一个Director类与用户对接,创建一个Builder接口,用户通过向Director动态传入Builder的不同实现,让Director帮助用户调用Buider中的方法并返回对象。Builder接口规定了构建对应一类复杂对象的各阶段过程,由其实现完成各阶段具体算法的填充。
构造方式:
|用户|——>|Facade|
|
|@$%^#|-|^&*^&|-|%%$&^|
其他:类似Template。
目的:将抽象概念间的关联与具体实现间的关联分离,避免过于复杂的继承结构。
方法:假设已有一个继承关系复杂的抽象接口。之所以说继承关系复杂是因为其需要同时适应多种无关属性的变化,如形状、颜色等。这时就可以将颜色相关的属性抽象为新接口与原有对象组合起来,完成桥接。
创建一个可分解的复杂概念接口,对概念的各组成部分分别创建接口,作为复杂概念的属性。不同的小概念分别有自己的继承树,通过组合完成复杂概念的复杂继承。
构造方式:
|Context|func(Strategty strategy)| <—— | Strategty|
|
|StrategtyA|——————————|StrategtyB|
其他:
目的:
方法:创建一个被代理对象的接口,创建其正常实现,创建Proxy类也作为接口的实现。在Proxy中存储一个接口的具体实现。通过延迟加载的方式可实现虚拟代理。
构造方式:
|用户|——>| Template|
|
|TemplateA|——————————|TemplateB|
其他:代理模式有三种情况:(1)远程代理——适合对象属性很少变化的情况(2)虚拟代理——适合创建对象开销很大的情况(3)保护代理——适合不同用户对对象有不同访问权限的情况。
目的:
方法:创建一个组件接口/抽象类,创建接口的一个叶子实现,创建一个Compsite类也作为其实现。Composite类中可存储叶子对象或Composite对象。完成递归式的调用、访问等功能。
构造方式:
| Aggregate|<——|用户|——>| Iterator |
| getIterator() | |next() hasNext() currentItem() |
| |
|ConcreteAggregate|<————————————————————>|ConcreteIterator|
其他:
目的:
方法:
创建一个Subject抽象类,其中定义notify()方法,给予其ConcreteSubject类实现。
创建一个Observer接口,其中定义update()方法,给予其ConcreteObserver类实现。Subject中保存订阅者(Observer)的列表,并提供注册和注销两种方法。在调用notify()改变自身状态后,同时调用所有订阅者的update()函数。
Observer中的update()可以拉取主体的状态,也可以将每一次外部调用作为信号来更新自己的属性。也可以直接让Subject将Observer关心的属性送到Observer中。
构造方式:
|Context|func(Strategty strategy)| <—— | Strategty|
|
|StrategtyA|——————————|StrategtyB|
其他:通知机制。
目的:
方法:
创建一个Mediator接口,其中规定send()和注册、注销方法。
创建一个People抽象类,其中存储Mediator,定义发送和接受方法、定义返回对应中介的方法。
在People的实现中,发送即调用Mediator的send()方法,将People想要传递的信息和People自身的表示发送给Mediator。接受方法即得到一定的信息,People可自行处理。
在Mediator的实现中维护一个订阅者列表,当Peolple调用send()方法时,将该信息发送给列表中调用除发送者外所有人的接受方法。
构造方式:
|用户|——>| Template|
|
|TemplateA|——————————|TemplateB|
其他:
目的:将数据结构与其上的处理分离(给Visitor),当逻辑发生变化时只需修改Visitor的实现。
方法:核心是重载。
创建一个Element接口,其中有Element希望完成的功能。
创建一个Visitor接口,其中有适应Element希望完成的功能的各种实现。
在Element的实现中,在功能函数里传入Visitor的实现,内部直接用Visitor中的实现方法,将Element自己传入Visitor中(委托)。
在Visitor的实现中,根据传入的Element不同,完成对应的功能实现。
构造方式:
| Aggregate|<——|用户|——>| Iterator |
| getIterator() | |next() hasNext() currentItem() |
| |
|ConcreteAggregate|<————————————————————>|ConcreteIterator|
其他:
目的:
方法:
构造方式:
|用户|——>| Template|
|
|TemplateA|——————————|TemplateB|
其他:
目的:
方法:
创建一个要管理的数据结构ADT,其中保有ADT的各种状态state。
创建一个Memento类,其中也保存着ADT的state。Memento中有getState()和setState()方法便于ADT进行状态保存和恢复。
创建一个CareTaker类,为了保证ADT的表示不会泄露。CareTaker存储一系列备忘录。CareTaker包含getMemento()和setMemento()方法。getMemento()即将存入的备忘录存储起来。setMemento()即将第i号备忘录返回给用户。
在ADT中加入setByMemento()和createNewMemento()方法。createNewMemento()即当ADT希望保存当前状态时,返回一个备忘录。setByMemento()即当传入备忘录时,ADT根据备忘录中的内容恢复为备忘录上记载的状态。
构造方式:
| Aggregate|<——|用户|——>| Iterator |
| getIterator() | |next() hasNext() currentItem() |
| |
|ConcreteAggregate|<————————————————————>|ConcreteIterator|
其他: