总览:
结构模式:
适配器模式:用于匹配不协调的接口的类。
装饰模式:动态地向一个类中的一个存在的对象添加或重写新的行为。
门面模式:为一堆庞大的代码提供一个简化的接口。
行为模式:
策略模式:举个例子,动物的叫声,猫和狗和其他动物的叫声都不一样,让系统根据对象的差别来正确地发出叫声就是策略模式。
模板模式:一些共性的行为就放在一起,不同的行为就在各个子类中实现。
1.行为模式
1.1适配器模式
将某个类/接口转换为Client期望的其他形式。
例子:
Client要创造一个长方形,已经存在的一个创造的长方形的方法要求的参数列表是长方形的一个顶点和长方形的长和宽,但是Client想要用长方形的对角的两个顶点的坐标创造一个长方形。这里就用到了适配器。
interface Shape { //这里是提供给Client的抽象接口
void display(int x1, int y1, int x2, int y2);
}
//完成接口,这个类即是适配器。
class Rectangle implements Shape {
void display(int x1, int y1, int x2, int y2) {
new LegacyRectangle(int x1, int y1, int x2-x1, int y2-y1);
}
}
//已经存在的创造长方形的方法。
class LegacyRectangle {
void display(int x, int y, int w, int l) {...}
}
1.2装饰器模式
用每个子类实现不同的特性,通过继承和委托共同实现。
例子:
//以栈的扩充为例,这里想要为栈增加一个undo功能,撤销PUSH或POP操作。
interface Stack {
void push(Item e);
void pop();
}
//创造一个普通的类来完成Stack接口。
public class ArrayStack implements Stack {
public ArrayStack() {...}
public void push(Item e) {...}
public void pop() {...}
}
//来完成一个用于装饰ArrayStack类的接口。
public class StackDecorator implements Stack {
protected final Stack stack;
public StackDecorator(Stack stack) {
this.stack = stack;
}
public void push(Item e) { //这里完全复用已经创建好的ArrayStack的方法。
stack.push(e);
}
public void pop() {
stack.pop();
}
}
//来完成undoStack。
public class UndoStack extends StackDecorator implements Stack {
... //这里用Override来向Stack已经完成的操作中添加新的机制。
}
1.3外观模式
客户端需要一个简化的接口来访问复杂系统内的功能。提供一个统一的接口来取代一系列小接口调用,对复杂系统做一个封装。
例子:
假设IF1和IF2是两个用户能调用的接口,里面都有f和g方法。
public class IF1 {
public void f() {}
public void g() {}
}
public class IF2{
public void f() {}
public void g() {}
}
//这里建立一个外观类来统一这两个接口,采用switch方法。
public generate {
public generate(String type, String operation){
switch(type){
case "IF1":{
switch(operation)
...
}
}
}
}
2.行为模式
2.1策略模式
有多种不同的算法来实现同一个任务,但需要client动态切换算法。为不同的实现方法构造抽象接口,利用delegation,运行时动态使用client指定的算法。(利用动态绑定)
例子:这里以支付的方式为例。
//首先创造一个抽象接口支付。
Interface pay {
void pay(int amount);
}
//接着创造两种支付方式。
public class Pay1 {
void pay(int amount) {...}
}
public class Pay2 {...}
//这里利用动态绑定机制来动态地执行client想要执行的支付方式。
2.2模板模式
做事情的步骤一样,但具体的方法不同。共性的步骤在抽象类中实现,差异化步骤在子类中实现。
注:使用继承和重写来实现模板。