原理介绍
装饰者模式就像打包一个快递,动态的将新工鞥附加到对象上。在对象功能扩展方面,比继承更加的有弹性。
原理图与解释如下:
实例分析:
抽象类
public abstract class Drink {
public String des; //描述
private float price = 0.0f;
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
/**
* 抽象方法,便于子类调用
* @return
*/
public abstract float cost();
}
实体类
public class Coffee extends Drink{
public float cost() {
return super.getPrice();
}
}
装饰者类
public class Decorator extends Drink{
private Drink drink;
public Decorator(Drink drink) {
this.drink = drink;
}
public float cost() {
// getPrice() 获得自己的价格
return super.getPrice()+drink.cost();
}
@Override
public String getDes() {
//输出被装饰者的信息
return super.getDes()+""+super.getPrice()+"&&"+drink.getDes()+""+drink.getPrice();
}
}
装饰者子类
public class Milk extends Decorator{
public Milk(Drink drink) {
super(drink);
setDes("Milk");
setPrice(2.0f); //调味品的价格
}
}
实体子类
public class ShortBlack extends Coffee{
public ShortBlack() {
setDes("ShortBlack");
setPrice(4.0f);
}
}
测试主类
public class CofferBAr {
public static void main(String[] args) {
//装饰者模式下的订单:2份巧克力+一份牛奶LongBlack
//1.点一份LongBlack
Drink drink = new LongBlack();
System.out.println("费用1 = "+drink.cost());
System.out.println("描述 = "+drink.getDes());
//2.加入一份牛奶
drink = new Milk(drink);
System.out.println("费用2 = "+drink.cost());
System.out.println("描述2 = "+drink.getDes());
drink = new Chocolate(drink);
System.out.println("费用3 = "+drink.cost());
System.out.println("描述4 = "+drink.getDes());
}
}
总结
装饰者模式是程序开发过程中使用的比较多。
- 需要定义清楚那个是抽象的主题类
- 需要定义清楚哪些类是装饰者的子类
- 在使用的过程中是装饰者在修饰实体类