装饰器模式解决的问题是:针对原有对象,进行任意或者动态的扩展组合。
实现方案:实现一个通用接口作为要拓展的对象,将主要功能委托给基础对象,然后增添功能。递归的方式实现,既使用了继承又使用了委托。
package decorator;
/**
* 冰淇淋,定义装饰物执行的公共接口.
* @author wwe
*
*/
public interface IceCreamComponent {
/**
* 增加装饰.
*/
public void AddTopping();
}
package decorator;
public class ConcreteIceCream implements IceCreamComponent{
@Override
public void AddTopping() {
System.out.println("Plain IceCream ready for some toppings!");
}
}
package decorator;
/**
* 装饰器基类.
* @author wwe
*
*/
public abstract class ToppingDecorator implements IceCreamComponent{
protected IceCreamComponent input;
public ToppingDecorator(IceCreamComponent i) {
this.input = i;
}
/**
* 留给装饰器实现.
*/
public abstract void AddTopping();
}
package decorator;
public class CandyTopping extends ToppingDecorator{
public CandyTopping(IceCreamComponent i) {
super(i);
}
/**
* 增加糖果装饰.
*/
public void AddTopping() {
input.AddTopping(); //首先装饰其他.
System.out.println("Candy Topping added");
}
}
package decorator;
public class NutsTopping extends ToppingDecorator{
public NutsTopping(IceCreamComponent i) {
super(i);
}
public void AddTopping() {
input.AddTopping(); //首先装饰其他.
System.out.println("Nuts Topping added");
}
}
package decorator;
public class PeanutTopping extends ToppingDecorator{
public PeanutTopping(IceCreamComponent i) {
super(i);
}
public void AddTopping() {
input.AddTopping(); //首先装饰其他.
System.out.println("Peanut topping added");
}
}
package decorator;
public class Client {
public static void main(String[] args) {
IceCreamComponent toppIceCream =
new NutsTopping(
new PeanutTopping(
new CandyTopping(
new ConcreteIceCream())));
toppIceCream.AddTopping();
}
}
```python
执行结果
Plain IceCream ready for some toppings!
Candy Topping added
Peanut topping added
Nuts Topping added
Component:接口,定义装饰物执行的公共操作
ConcreteComponent:起始对象,在其基础上动态的增加功能,需要首先创建该对象,并将通用的方法添加到此对象中。
Decorator抽象类是所有装饰类的基类,里面包含的成员变量Component指向了被装饰的对象。
ConcreteDecorator:装饰类,增加需要装饰的特征,可以根据需求实现不同的装饰类,每个类提供的装饰特征都能加入到被装饰对象中。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190618183958652.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzI3NDI0,size_16,color_FFFFFF,t_70)