面向复用的设计模式
Adapter适配器模式:
情境:对旧的不兼容的组件进行封装,使新的系统使用的旧的组件。
Adaptee:存在的类,旧的组件。
ITarget:在新的组件中定义的接口,需要该接口完成一定功能,该功能在Adaptee中已经实现。
Adapter:创建的类,继承Adaptee并实现ITarget。实现接口中的方法时调用基类的已存在的方法以实现复用。
Decorator装饰器模式
情境:需要任意或者动态为一个对象组合不同的扩展
为你要扩展的对象实现一个公共的接口,添加功能,但把基本的职责交给原来的对象。
Component:定义了一个操作,或者装饰器可以装饰的特点。
ConcreteComponent:需要动态添加功能的起始对象,创建它并一步步装饰它。
Decorator:抽象类,是所有装饰器的基类。实现了Component接口同时在域中包含一个Component对象(这就是要加工的对象),该对象在构造器中申请。
ConcreteDecorator:实际的装饰器类用以添加功能,可以无限多,每个都应该添加独立的功能。
以冰淇凌加工为例具体介绍一下过程:
public interface IceCream {
//顶层接口 void AddTopping();
}
public class PlainIceCream implementsIceCream{
//基础实现,无填加冰激凌
@Override
public voidAddTopping() {
System.out.println("PlainIceCream ready for some toppings!");
}
}
/*装饰器基类*/
public abstract class ToppingDecoratorimplements IceCream{
protectedIceCream input;
publicToppingDecorator(IceCream i){
input = i;
}
public abstract void AddTopping(); //留给具体装饰器实现
}
public class CandyTopping extendsToppingDecorator{
publicCandyTopping(IceCream i) { super(i); }
public voidAddTopping() {
input.AddTopping(); //decorate others first
System.out.println("Candy Topping added!");
}
}
public class NutsTopping extendsToppingDecorator{ //similar to CandyTopping }
public class PeanutTopping extendsToppingDecorator{ //similar to CandyTopping}
客户端代码:
public class Client {
public staticvoid main(String[] args) {
IceCream a = new PlainIceCream();
IceCream b = new CandyTopping(a);
IceCream c = new PeanutTopping(b);
IceCream d = new NutsTopping(c); d.AddTopping();
//or IceCream toppingIceCream = new NutsTopping( new PeanutTopping(new CandyTopping( new PlainIceCream() ) ) );
toppingIceCream.AddTopping();
}
Façade外观模式:
情境:客户端需要实现内部一系列复杂操作的子系统的简化接口
需要提供一个用于处理子系统内部许多复杂操作的接口从而,需要在接口中实现一些方法,这些方法将子系统中的复杂操作封装起来,从而使得客户可以简化操作。
Strategy 策略模式:
情境:对于一个具体的任务,存在不同的算法,客户端要求允许在运行时动态的选择不同的算法。
创建一个针对算法的接口,有以许多具体的实现类,每种对应一种算法。
TemplateMethod:模板方法
情境:几个客户共用同样的算法但有些细节存在差别。这个公共的算法由可定制的部分和不变的部分构成不同的客户端具有相同的算法步骤,但步骤的具体实现不同。
在父类中定义通用的逻辑和各步骤的抽象方法声明,在子类中实现各步骤的具体实现。
Iterator:迭代器模式
情境:客户端需要一个统一的策略在容器中遍历所有的元素。
将遍历的具体操作隐藏起来,为客户端提供几个易用的方法实现遍历,像HashSet中的Iterator,提供了next(),hasnext(),简单的进行了遍历操作