在4.3节中提到了很多种设计模式,这里对其进行总结
首先大体上,这些设计模式分为
- 结构型模式 :处理类或对象的组成结构,解耦多个类,引入一个抽象类用于将来的扩展;封装复杂的结构。
- 行为类模式 :描述类/对象交互和互相分配责任的方式,允许算法和对象职责分配之间的选择(“谁做什么”);简化在运行时难以追踪的复杂的控制流。
一.结构型模式
1.适配器模式
将某个类/接口转换为客户端期望的其他形式,通过增加一个接口,作为两个互不相容的接口的适配器,将已存在的子类封装起来,适配器模式让本来接口不兼容而无法在一起工作的类相互适配
而客户端面向接口编程,从而隐藏了具体子类。
通常应用于将旧类/接口重用到新系统中(也称为“包装器”),提供访问旧组件的入口
实例:
LegacyRectangle类有display()方法,需要传入矩形的4个参数:顶点坐标(x,y)、宽和高(w,h)
但是客户端只想要传递参数左上顶点坐标(
x
1
x_1
x1,
y
1
y_1
y1)和(
x
2
x_2
x2,
y
2
y_2
y2),在满足客户的需求的前提下重用旧组件,可以使用适配器模式:类图如下所示
在Rectangle类中通过 delegation 完成适配,实际执行LegacyRectangle类的display()方法
实现代码:
2.装饰器模式
装饰器模式为对象增加不同侧面的特性,对每一个特性构造子类,通过委派机制增加到对象上,向一个现有的对象添加新的功能,同时又不该边其结构,实现特性的任意组合。
装饰器模式基于一个用于 decorator的基础类,完成基础和通用的功能;如果客户端需要一个具有多种特性的类,就可以通过一层一层的装饰来实现,需要一个抽象类作为所有装饰子类的通用父类,然后将具体功能职责划分,对每一个特性构造子类,通过委派机制增加到对象上。
装饰器模式同时使用继承和委托,它比静态继承更灵活,同时具有可自定义的扩展功能
实例
对于一个栈结构,使用装饰器模式设计如下:
代码:
interface Stack {
void push(Item e);
Item pop();
}
public class ArrayStack implements Stack {
... //rep
public ArrayStack() {
...
}
public void push(Item e) {
...
}
其中ArrayStack实现最基础的 Stack功能,被委派以基础的Stack功能
public abstract class StackDecorator implements Stack {
protected final Stack stack;
public StackDecorator(Stack stack) {
this.stack = stack;
}
public void push(Item e) {
stack.push(e);
}
public Item pop() {
return stack.pop();
}
...
StackDecorator 作为一个抽象类是所以装饰子类的通用父类,给出一个用于 decorator的装饰品的载体(类似毛坯房),基础功能(push和 pop)通过 delegation在ArrayStack中实现
public class UndoStack extends StackDecorator implements Stack {
private final UndoLog log = new UndoLog();
public UndoStack(Stack stack) {
super(stack);
}
public void push(Item e) {
log.append(UndoLog.PUSH, e);
super.push(e);
}
public void undo() {
//implement decorator behaviors on stack } ...
UndoStack 是一个实现了的具有特性的装饰器子类,其基础功能在父类中通过delegation实现,同时又增加了新特性UndoStack和undo
实际调用:
- 如果客户端只需调用一个简单的栈,只需要
Stack s = new ArrayStack();
- 如果客户端需调用一个具有undo功能的栈,只需要
Stack t = new UndoStack(new ArrayStack());
- 如果客户端需要一个具有多种特性的栈,通过一层一层的装饰来实现
Stack t = new SecureStack( new SynchronizedStack( new UndoStack(s))
对于这个secure synchronized undo stack,首先最底层的s是一个基础的stack,而UndoStack将s作为构造方法的参数构造一个UndoStack,装饰上了Undo的特性,同理SynchronizedStack和SecureStack在基于UndoStack的基础上,装饰上了Synchronized和Secure的特性,层层装饰实现了一个具有特定功能的栈
PS:装饰器模式和继承模式的不同:
- 装饰器模式在运行时组合功能,继承在编译时组合功能
- 装饰器模式由多个协作对象组成,而继承生成单个清晰类型的对象
- 装饰器模式可以混合并匹配多个修饰,而多重继承会导致组合爆炸现象
3. Facade
这个在之前的博客中已经总结过了
参考:
https://blog.csdn.net/Franklins_Fan/article/details/105667169