写在前面:阅读设计模式的时候或许会觉得许多设计模式都不过是多此一举,但如果站在自己是类库开发者为用户服务的角度想问题,将自己想象成用户,将自己置身于多人程序开发的场景,就能理解设计模式的好处了。
目的:解决类之间接口不兼容的问题。即原类基本可以满足新的要求,却因函数名、参数列表、返回值等差异无法直接作为目标接口的实现。
方法:在原类基础上创建Adapter类以适应新的功能。
构造方式:
|用户| <—— | Target| |原类|
| 实现 | 继承或委托
————|Adapter|————
其他:emmm,有一个原类,新建一个接口,想实现时借用原方法也就算Adapter了啊~接口的好处是可以将多种实现归属为一类对象。
目的:需要对某个基础概念进行任意/动态地组合为复合概念。
方法:将复合概念的组件分解,通过Decorator抽象类的各种嵌套构建完成添加动作。
构造方式:
| Pizza|————————————
| 实现 | 继承
|ConcretePizza| | Decorator|Pizza pizza|construct(pizza) add()|
|
|TopA|——————————|TopB|
其他:毕竟这是为了复用的设计模式嘛,要是单纯只用一个方法来分别设置就能完成的场合,就不需要一定用类嵌套构建的方式完成了。
目的:调用者需要简化的接口来调用复杂系统的整体功能。
方法:提高接口的层次,隐藏各种内部关系与原子操作,只将组合好的调用序列用Facade包装起来交给用户调用。
构造方式:
|用户|——>|Facade|
|
|@$%^#|-|^&*^&|-|%%$&^|
其他:这个设计模式,相信大家平时编程的时候即便没有注意也确实在使用,比如将控制台的输入转化为GUI中的按钮,这过程就必然经过了”Facade“,高级语言实际上是将更底层,更复杂的设计关系模块化供使用者调用。
目的:调用者希望在编程时动态选择某一问题的解决算法。
方法:将算法部分用类包装起来,用Strategy接口将所有算法的具体实现归为一类,使用时动态传入策略以决定使用何种实现。
构造方式:
|Context|func(Strategty strategy)| <—— | Strategty|
|
|StrategtyA|——————————|StrategtyB|
其他:面向可复用性的设计模式的关键之处就在于利用接口归类上,如此便可用创建不同类的方式节约switch链等写死在程序中的代码,增加复用性,便于扩展。
目的:不同的模块具有相同的处理步骤,但不同类的实现不同。调用者以统一的格式调用,编程者显示地声明这种关系。
方法:用统一的Template抽象类作为模板(传入不同Strategy),或用具体子类完成多种实现。
构造方式:
|用户|——>| Template|
|
|TemplateA|——————————|TemplateB|
其他:唔姆,应该也可以用Strategy完成不同的实现吧~
目的:调用者需要以统一的,类型无关的方式访问容器中的所有元素。
方法:定义Iterator接口规定迭代器的基本操作并实现。
构造方式:
| Aggregate|<——|用户|——>| Iterator |
| getIterator() | |next() hasNext() currentItem() |
| |
|ConcreteAggregate|<————————————————————>|ConcreteIterator|
其他:注意,Iterator可直接获得Iterable的属性,不要再传进Iterator了_(: 3 ∠_)_