设计模式:针对软件设计中给定环境中经常出现的问题的通用的、可重用的解决方案。除了类本身,设计模式更强调多个类/对象之间的关系和交互过程—比接口/类复用的力度更大。
面向复用的设计模式主要有以下几种:
结构模式
(通过改变类的结构,使类具有新的特性。)
适配器模式
当用户希望的接口形式(参数形式)和已经实现的方法接口(可复用的方法)不匹配时,需要设计一个适配器接口,适配器中所有API的格式都符合用户的要求,在适配器接口的具体实现中调用可复用的方法即可。
装饰器模式
适用场景:一个基础类想要扩展另外的特性时(多个,如果使用直接使用继承,因为会组合爆炸,而生成复杂的继承树,且工作量很大,会有较多的重复代码,不符合可复用性软件的需求。),需要使用装饰器模式(继承+委托),可以实现需要增加的特性的任意组合。
实现方法:创建一个装饰类,有一个指向基础类的引用,里面所有的方法都是通过委托给基础类来实现的。然后通过继承装饰类来实现各个需要增加的功能。
在使用时,因为装饰类中是其他类的引用,所以可以用添加了功能1的类作为功能2的类中的引用,即可实现层层套用装饰了。
门面模式
提供一个统一的接口来取代一系列小接口调用,相当于对复杂系统做了一个封装,简化客户端使用。
行为模式
(如何在类中的多个行为之间进行切换。)
策略模式
适用场景:有多种不同的算法来实现同一个任务,但需要client根据需要动态切换算法,而不是写死在代码里。
实现方法:为不同的实现算法构造抽象接口,利用delegation,运行时动态传入client倾向的算法类实例。
模板模式
实现算法的步骤相同,但具体的实现方法不同,例如,设计framework时的白盒框架。实现方法一般为继承父类,父类一般为抽象类,共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现。使用继承和重写实现模板模式。(其中固定的方法可以用final关键字来修饰。)
迭代器模式
适用场景:客户端希望遍历被放入容器/集合类的一组ADT对象,无需关心容器的具体类型。当有需求设计一个集合类时,同时应该实现该集合类的迭代器。
迭代器模式的实现方法:设计集合类的接口,继承Iterable接口,
public interface Iterable<T>{
...
Iterator<T> iterator();
}
这样设计的集合类就能生成属于每个实例对象的迭代器了,在该方法中,会把该实例的集合引用传递给迭代器。然后实现自己的独特Iterator 迭代器(hasNext, next, remove) ,允许客户端利用这个迭代器进行显式或隐式的迭代遍历:
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
显示遍历:Iterator<E> iter = collection.iterator(); while(iter.hasNext()) { … }
隐式遍历:for (E e : collection) { … }
创建模式
(之后再补)