我觉得装饰者模式是在已有功能的基础之上,动态地添加更多 功能的一种方式,这些新加的代码装饰了原有类的 核心职责或主要行为。
类UML图
image.png1、首先我们定义一个Coffce基类
/**
* @ explain:这里Coffee相当于我们的Component,
* 是要装饰的类
*
*/
public abstract class Coffee {
/**
*
* @return 返回价格
*/
public abstract int getPrice();
/**
* 返回名字
* @return
*/
public abstract String getName();
}
2、接着 我们定义一个Decorator类继承 我们的Coffice基类
/**
* @ explain:Decorator类继承 我们的Coffice基类
* @ author:
* @ email:
*/
public abstract class Decorator extends Coffee{
protected Coffee mCoffee;
/**
* 通过组合的方式把Coffee对象传递进来
* @param coffee
*/
public Decorator(Coffee coffee){
mCoffee=coffee;
}
}
3、接下来我们来看我们的子类是怎样实现的
public class MilkDecorator extends Decorator {
/**
* 通过组合的方式把Coffee对象传递进来
*
* @param coffee
*/
public MilkDecorator(Coffee coffee) {
super(coffee);
}
@Override
public int getPrice() {
return mCoffee.getPrice()+10;
}
@Override
public String getName() {
return "addMilk";
}
}
4、接下来不难想象加糖,就奶泡。就摩卡的操作,都是在原来的之上加上配料的价格
return mCoffee.getPrice()+2;
return mCoffee.getPrice()+15;
return mCoffee.getPrice()+20;
以后你想要计算加糖,就牛奶,加奶泡的咖啡的价格,只需要这样
mCoffee = new SimpleCoffee();
mCoffee = new SugarDecorator(mCoffee);
mCoffee = new MilkDecorator(mCoffee);
mCoffee = new MilkFoamDecorator(mCoffee);
int price1 = mCoffee.getPrice();
System.out.println("price1="+price1);
以后你想要计算加糖,就牛奶咖啡的价格,只需要这样
mCoffee = new SimpleCoffee();
mCoffee = new SugarDecorator(mCoffee);
mCoffee = new MilkDecorator(mCoffee);
int price1 = mCoffee.getPrice();
System.out.println("price1="+price1);
装饰者模式的优缺点
优点
- 把类中的装饰功能从类中搬除,可以简化原来的类
- 可以把类的 核心职责和装饰功能区分开来,结构清晰 明了并且可以去除相关类的重复的装饰逻辑。
网友评论