这是本人学习Java23种设计模式期间总结和记录,主要听的课程是尚硅谷——韩顺平老师的课程,这个课程可谓是非常详细了,推荐学习。
这里讲到装饰者设计模式,装饰者模式在新手初学的时候总觉得和桥接模式没啥区别,甚至称他们两为相同的模式,但是仔细理解以后,他们两个还是有着本质上的区别,首先他们作用方面都是一样的,都是将同一个东西的两个共同组成属性抽出来,然后需要新添加东西的时候只需添加对应的属性就行了。
但是桥接模式对应的是很严格的匹对,某样东西对应某种属性,某些东西对应不了这个属性。就用手机举例,很多手机品牌都对应着刘海屏的属性,很多品牌都对应的是安卓系统;但是,苹果手机虽然对应着刘海屏,但是对应的不是安卓系统,其他手机品牌也无法对应苹果系统,这样就不是桥接模式了,因为你不能随心所欲的添加属性或者其他,因为有着严格对应关系,而装饰者模式就不一样了,比如一份饮料,他什么配料都可以加,可以加珍珠,可以加糖,不论你是添加配料也好,还是添加新的饮料也好,他们都可以组合在一起,装视起来。举例咖啡饮品,代码如下:
@Setter
@Getter
public abstract class Drink {//不论是咖啡还是配料,最终搭配好的都是饮品
public String des;
private float price;
public abstract float cost();
}
public class Coffee extends Drink {//咖啡的对象
@Override
public float cost() {
return super.getPrice();
}
}
public class Decorator extends Drink{//配料的对象
private Drink drink;
public Decorator(Drink drink) {
this.drink = drink;
}
@Override
public float cost() {
return this.getPrice() + drink.cost();
}
@Override
public String getDes(){
return this.des + " " + this.getPrice() + "&&" + drink.getDes();
}
}
public class Latte extends Coffee{//具体的拿铁咖啡
public Latte() {
setDes("拿铁咖啡");
setPrice(20.0f);
}
}
public class Milk extends Decorator {//具体的牛奶配料
public Milk(Drink drink) {
super(drink);
setDes("加牛奶");
setPrice(2.0f);
}
}
public class CoffeeBar {//制作咖啡,将任意的配料加入咖啡
public static void main(String[] args) {
Drink latte = new Latte();
System.out.println(latte.getDes() + latte.getPrice());
latte = new Milk(latte);
System.out.println(latte.getDes() + latte.cost());
latte = new Milk(latte);
System.out.println(latte.getDes() + latte.cost() );
}
}
装饰者模式定义
- 装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)
- 这里提到的动态的将新功能附加到对象和 ocp 原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。
装饰设计模式咖啡例子示意图: