8.装饰者模式
动态的将新功能附加到对象上
实例
最基础的抽象类Drink
/** * @author wuyimin * @create 2021-07-26 17:14 * @description 饮料的抽象类 包含描述,价格以及子类计算总价的方法 */ public abstract class Drink { private int price; private String info; protected abstract int cost(); public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } }
咖啡类和添加物类都继承了Drink类,不同的是咖啡类继承后仅仅重写了cost方法,而添加物类使用聚合引入了一个drink类的对象,重写了cost和getinfo方法
咖啡类:
/** * @author wuyimin * @create 2021-07-26 17:18 * @description 咖啡类继承了饮料类 */ public class Coffee extends Drink { //它的cost方法仅仅是返回drink的价格 @Override protected int cost() { return super.getPrice(); } }
添加物类:
/** * @author wuyimin * @create 2021-07-26 17:24 * @description 添加类 */ public class Decorator extends Drink { private Drink drink;//聚合 public Decorator(Drink drink){ this.drink=drink; } @Override protected int cost() { //获得原来咖啡的价格+添加物的价格 return super.getPrice()+drink.cost(); } @Override public String getInfo() { return super.getInfo()+super.getPrice()+"--"+drink.getInfo(); } }
实现类,实现类的作用主要就是为了设置每个物品的价格和描述
/** * @author wuyimin * @create 2021-07-26 17:19 * @description A和B实现类的功能是设置信息和价格 */ public class CoffeeA extends Coffee { CoffeeA(){ setInfo("咖啡A"); setPrice(1); } } /** * @author wuyimin * @create 2021-07-26 17:19 * @description A和B实现类的功能是设置信息和价格 */ public class CoffeeB extends Coffee { CoffeeB(){ setInfo("咖啡B"); setPrice(2); } } /** * @author wuyimin * @create 2021-07-26 17:30 * @description 第一种调味品 */ public class DecoratorA extends Decorator { public DecoratorA(Drink drink) { super(drink);//使用父类Decorator的构造器方法 setPrice(1); setInfo("调味品A"); } } /** * @author wuyimin * @create 2021-07-26 17:30 * @description 第二种调味品 */ public class DecoratorB extends Decorator { public DecoratorB(Drink drink) { super(drink); setPrice(2); setInfo("调味品B"); } }
桥接模式和装饰者模式的区别
第一种说法
装饰器模式用于动态地添加职责,原本的功能必须执行,对用户而言重要的是添加的职责
桥接模式用于抽象和实现的分离,即从不同维度划分类的属性,以聚合的方式桥接,降低耦合。
第二种说法
1。桥接模式中所说的分离,其实是指将结构与实现分离(当结构和实现有可能发生变化时)或属性与基于属性的行为进行分离;而装饰者只是对基于属性的行为进行封闭成独立的类。
2。桥接中的行为是横向的行为,行为彼此之间无关联;而装饰者模式中的行为具有可叠加性,其表现出来的结果是一个整体,一个各个行为组合后的一个结果
第三种说法
区别:
1.没有装饰者和被装饰者的主次区别,桥接和被桥接者是平等的,不用继承自同一个父类。(即桥接可以互换)
2.桥接模式不用使用同一个接口;装饰模式用同一个接口装饰,接口在父类中定义。
相同点:
1.都可以处理类扩散的情况
以下情况使用Decorator模式(摘自《设计模式》):
• 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
• 处理那些可以撤消的职责。
• 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
/**
* @author wuyimin
* @create 2021-07-26 17:24
* @description 添加类
*/
public class Decorator extends Drink {
private Drink drink;//聚合
public Decorator(Drink drink){
this.drink=drink;
}
@Override
protected int cost() {
//获得原来咖啡的价格+添加物的价格
return super.getPrice()+drink.cost();
}
@Override
public String getInfo() {
return super.getInfo()+super.getPrice()+"--"+drink.getInfo();
}
}