设计模式——可复用性篇
结构
适配器模式
目的:将某个类/接口转换为client期望的其他形式
途径:通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类
具体来讲,方法参数列表不符,用接口封装,将接口的参数列表调整为用户想要的,在接口中转换,将计算的功能还是委托给原来的方法
装饰器模式
目的:为普通对象增加不同侧面的特性
途径:对每一个特性构造子类,通过委派机制增加到对象上
如上图,接口下的两个子类分别是普通类和装饰接口,装饰接口属性中有普通类,将普通操作委托给普通类,同时增加新的侧面特性功能
用户的用法:客户端需要一 个具有多种特性的object,通过一层一层的装饰来实现(可以这样实现的原因是每个类的结构器都是最初的接口类型)
跟继承的对比:装饰器是在运行的过程中动态组合的,而继承是静态检查的;装饰器是可以动态组合的,而继承的功能是单一的确定的
外观模式(门面模式)
目的: 客户端需要通过一个简化的接口来访问复杂系统内的功能 ,便于客户端学习使用,解耦
途径:提供一个统一的接口来取代一系列小接口调用,相当于对复杂 系统做了一个封装,简化客户端使用
行为
策略模式
目的:解决client根据需要要求动态切换算法,而不是写死在代码里
途径:为不同的实现算 法构造抽象接口,利用delegation,运行时动态传入client倾向的算法 类实例
例子:比如说排序,在不同的情况下需要选择不同的方法,但排序出来的结果是一致的
模板模式
目的:解决做事情的步骤一样,但具体方法不同的问题
途径:共性的步骤在抽象类内公共实现,差 异化的步骤在各个子类中实现,使用了继承和重写,模板模式属于白盒应用
迭代器模式
目的:客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型 ,也就是说,不管对象被放进哪里,都应该提供同样的遍历方式
途径:实现Iterable接口,并实现独特Iterator迭代器(hasNext, next, remove),允许客户端利用这 个迭代器进行显式或隐式的迭代遍历