工厂方法模式(虚拟构造器)
- client无需知道应该创建哪个具体类的实例
- 定义一个创建对象的接口,让接口的子类型决定实例化哪一个类,延迟类的实例化
- 还可以根据向工厂方法传入的参数决定实例化的类
- 不足:每增加一种类的实现就要修改工厂方法或者增加工厂类
适配器模式
- 解决类之间接口不兼容的问题:增加一个接口,封装已有子类
- 适配器可以通过继承或者委托实现
装饰器模式(我说今年必考,重点!)
- 解决的问题:为对象增加不同方面的特性
- 对每一个特性构造子类,通过委托增加到对象上
- Decorator抽象类是所有装饰类的基类,component指向被装饰的对象(由原始类TextView实现)
- 装饰类方法的实现:(一种可能)
public void Draw(){
super.Draw();
/* add some new features */
}
装饰类特性组合:
VisualComponent v = new TextView();
VisualComponent c = new ScrollDecorator(new BorderDecorator(v) )
一层一层加盖式构造(这时我们应该体会到同名方法调用super的妙处了)
策略模式
- 通过委托机制,在不同条件下用不同的方法实现同一个任务
模板模式
- 一样的步骤,不一样的实现
- 共性步骤在抽象类中公共实现,差异化步骤在各个子类实现
- 使用继承和重写实现模板模式
- 应用:框架
- 举例:
public void DoRead(){ Open();//how? Save(); Close(); }
访问者模式:
- 对特定类型对象的特定操作visit,本质上将数据和作用于数据的特点接口分离开
- 为ADT预留一个可扩展点,外部实现功能可以在不改变ADT的情况下通过委托接入
- 在ConcreteVisitor中决定做何种行为
- 使用visitor:
int accept(Visitor visitor){ visitor.visit(this); }