介绍:在不改变原有类和使用继承的情况下,动态扩展一个对象的功能。
结构:
原始接口、
原始实现类(要进行装饰的类)、
装饰者基类(实现产品接口的一个抽象类)、
具体装饰者实现类
实现:
1、原始接口
public interface ICoffee {
void makeCoffee();
}
2、原始对象
public class OriginalCoffee implements ICoffee {
@Override
public void makeCoffee() {
System.out.print("原味咖啡 ");
}
}
3、装饰者基类(实现与原始对象相同的接口,内部持有一个接口类型的引用)
public abstract class CoffeeDecorator implements ICoffee {
private ICoffee coffee;
public CoffeeDecorator(ICoffee coffee){
this.coffee=coffee;
}
@Override
public void makeCoffee() {
coffee.makeCoffee();
}
}
4、各种装饰者类(直接继承装饰者基类)
public class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(ICoffee coffee) {
super(coffee);
}
@Override
public void makeCoffee() {
super.makeCoffee();
addMilk();
}
private void addMilk(){
System.out.print("加奶 ");
}
}
public class SugarDecorator extends CoffeeDecorator {
public SugarDecorator(ICoffee coffee) {
super(coffee);
}
@Override
public void makeCoffee() {
super.makeCoffee();
addSugar();
}
private void addSugar(){
System.out.print("加糖");
}
}
5、客户端调用
public static void main(String[] args) {
//原味咖啡
ICoffee coffee=new OriginalCoffee();
coffee.makeCoffee();
System.out.println("");
//加奶的咖啡
coffee=new MilkDecorator(coffee);
coffee.makeCoffee();
System.out.println("");
//先加奶后加糖的咖啡
coffee=new SugarDecorator(coffee);
coffee.makeCoffee();
}
装饰模式精髓在于动态给对象增减功能
装饰模式通过组合排列方式给对象增减功能;代理模式通过继承给对象增减功能
装饰模式侧重于使用装饰类对原类的功能进行增减;代理模式侧重于增强被代理对象的访问
装饰者支持提供一组装饰者类,通过组成形成装饰栈,对某一个对象功能不断增强;而代理模式一般不会使用多级代理