1. 装饰者模式
装饰者模式(Decorator Pattern)是结构性设计模式,其目的是动态地增强类的功能,却没有采用继承该类的方式。装饰者模式通过增加装饰者类的做法,扩大了类的结构。
装饰者模式的角色一共有三种。
Component(抽象组件): 装饰者和被装饰对象实现的共同接口。
ConcreteComponent(具体组件):是被装饰的对象。
Decorator(装饰类): 负责装饰具体组件,即为被装饰的对象增强功能。本模式的核心。
如果具体的组件有多个,同时又要增加不同的功能,即需要多个装饰者的时候,可以把装饰类拆分成 抽象装饰者和具体装饰者。
2. 装饰者模式举例
下面我们举一个商店卖商品的例子,不使用继承的手段,给商店增强“叫卖”的功能。
序号 | 类名 | 角色 | 说明 |
---|---|---|---|
1 | Store | Component | 抽象组件,商店 |
2 | FoodStore | ConcreteComponent | 具体组件类,食品商店 |
3 | StoreDecorator | Decorator | 装饰类,给商店增强功能 |
4 | DecoratorMain | 客户端 | 演示调用 |
1. Store类
// 抽象组件,商店
public interface Store {
// 售卖
void sell();
}
2. FoodStore类
// 具体组件类,食品商店
public class FoodStore implements Store{
@Override
public void sell() {
System.out.println("卖蛋糕咯");
}
}
3. StoreDecorator
//具体装饰者,扩展食品商店的功能
public class StoreDecorator implements Store{
private Store store;
//装饰者类应该包含一个以被装饰者对象为参数的构造函数。
// 注意对比代理模式中的代理类,构造器是不同的。
public StoreDecorator(Store store) {
this.store = store;
}
// 给Store来点功能扩展,加上叫卖
public void sell() {
System.out.println("瞧一瞧,你不吃亏;看一看,你不上当。");
store.sell();
System.out.println("欢迎下次再来");
}
}
4. DecoratorMain
// 客户端,演示调用
public class DecoratorMain {
public static void main(String[] args) {
Store store = new FoodStore();
StoreDecorator decorator = new StoreDecorator(store);
decorator.sell();
}
}
3. 装饰器模式总结
优点:
可以动态扩展一个对象的功能,比继承的方式更为灵活;可以用多个装饰者装饰同一个对象。
缺点:
装饰类多了,对象都很相似,容易看花眼。
(完)