定义
我理解的装饰者模式就是1+1+1+1+1+1,做蛋糕
装饰者模式又叫做包装(wrapper)模式。可以层层包装。
不改变原有对象的基础上,将功能附加到对象上,功能扩展。
装饰者模式侧重点不在于方法的流程控制,而是方法本身的动态扩展。代理模式或者继承重写方法的方式在编译时类之间的关系就已经确定的,装饰者模式(wrapper)就像层层包装一样,可以根据需求,动态的给目标方法上 不断动态扩展。
通过使用不同装饰类以及这些类的排列组合,可以实现不同的效果。
先看类图
角色:
Component接口:定义该类具有的方法,该方法需要被装饰
ConcreteComponent : 接口的实现类
Decorator :抽象装饰类,和被装饰类实现同一个接口,
ConcreteDecorator:装饰类的实现类,具体的方法扩展,可以层层包装
代码演示
1、定义抽象的Component组件,其中的方法将会被增强
package Decorator;
public interface Food {
//待增强的方法
String getDescription();
}
2、ConcreteComponent实现类
"基础功能"
package Decorator;
public class BasicSet implements Food{
@Override
public String getDescription() {
// getDescription 最最原始的功能,只能返回汉堡+可乐
//现在对这个功能进行扩展,装饰不同的东西,让他可以返回"不同"的组合
return "汉堡"+"+ 可乐";
}
}
3、定义一个抽象装饰类,统一规范,所有对基础食物进行装饰的类都必须继承该类
package Decorator;
public abstract class Decorator implements Food{
Food food = null;
public Decorator(Food food) {
this.food = food;
}
public String getDescription(){
return this.food.getDescription();
}
}
4、定义四个具体的装饰类(ConcreteDecorator)
具有相同的结构
package Decorator;
//将基础构件装饰成薯条套餐,在原有的基础上装饰
public class FrenchFries extends Decorator{
public FrenchFries(Food food) {
super(food);
}
//怎么装饰这个方法
@Override
public String getDescription() {
return super.getDescription() + "+ 薯条";
}
}
package Decorator;
/**
* 将食物加工成炸鸡
*/
public class FriedChicken extends Decorator{
public FriedChicken(Food food) {
super(food);
}
@Override
public String getDescription() {
return super.getDescription()+"+ 炸鸡";
}
}
package Decorator;
/**
* 在食物上添加冰激凌
*/
public class IceCream extends Decorator{
public IceCream(Food food) {
super(food);
}
@Override
public String getDescription() {
return super.getDescription()+"+ 冰激凌";
}
}
5、装饰类的调用,更具装饰类调用的顺序,是否调用,可以获得不同的装饰结果,实现功能的动态扩展(而代理模式在编译时关系就是已经确定了)
package Decorator;
/**
* 测试类,可以根据装饰的顺序不同,获得不同的对象
*/
public class Test {
public static void main(String[] args) {
Food food = new BasicSet();
System.out.println(food.getDescription());
//装饰薯条
Food decorator = new FrenchFries(food);
System.out.println(decorator.getDescription());
//装饰冰激凌
decorator = new IceCream(decorator);
System.out.println(decorator.getDescription());
//装饰炸鸡
decorator = new FriedChicken(decorator);
System.out.println(decorator.getDescription());
}
}
5、输出结果
汉堡+ 可乐
汉堡+ 可乐+ 薯条
汉堡+ 可乐+ 薯条+ 冰激凌
汉堡+ 可乐+ 薯条+ 冰激凌+ 炸鸡
装饰者模式和代理模式的区别
都可以不改变原来的类,对功能进行扩展
1、装饰器模式关注于在一个对象的 方法上动态的添加方法,强调把他装饰成什么什么样,然而代理模式关注于控制对对象的访问。
2、使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。
3、装饰则可以动态添加方法,代理模式不行,代理模式更多的做流程控制,隐藏实际的委托者;装饰者是方法横向的扩展,代理是纵向的流程扩展。