1.1 装饰者模式的概念
1、在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。装饰对象可以在转发这些请求以前或以后增加一些附加功能。
1.2 应用场景
比如我们去买一个肉夹馍,你可以选择加生菜、鸡蛋、鸡柳、香肠等等,一个肉夹馍加上不同的配料价格是不同的,那么我们如何去计算价钱呢?
(1)抽象组件(Component)角色:给出一个抽象类,以规范准备接收附加功能的对象。
(2)具体组件(Concrete Component)角色:定义一个将要接收附加功能的类。
(3)装饰(Decorator)角色:持有一个组件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:负责给组件对象添加上附加的功能。
1.3 肉夹馍实例
抽象组件(Component)角色:首先我们是定义一个抽象类ShouZhuaBingInterface,同时定义好基础的功能:
public interface ShouZhuaBingInterface {/*** 描述** @return*/public String getDesc();/*** 手抓饼价格** @return*/public int getPrice();
}
具体组件(Concrete Component)角色:定义一个被装饰的类,实现ShouZhuaBingInterface接口,并实现具体功能:
public class ShouZhuaBing implements ShouZhuaBingInterface{@Overridepublic String getDesc() {return "手抓饼";}@Overridepublic int getPrice() {return 5;}
}
装饰(Decorator)角色:定义一个装饰抽象类Deractor,实现ShouZhuaBingInterface接口,并拥有一个ShouZhuaBingInterface实例:
public abstract class Deractor implements ShouZhuaBingInterface {private ShouZhuaBingInterface shouZhuaBingInterface;public Deractor(ShouZhuaBingInterface shouZhuaBingInterface) {this.shouZhuaBingInterface = shouZhuaBingInterface;}@Overridepublic String getDesc() {return shouZhuaBingInterface.getDesc();}@Overridepublic int getPrice() {return shouZhuaBingInterface.getPrice();}
}
具体装饰(Concrete Decorator)角色:定义具体装饰类,继承装饰抽象类Deractor,并在其中扩展具体组件角色的功能:
鸡蛋装饰:
public class EggDeractor extends Deractor {public EggDeractor(ShouZhuaBingInterface shouZhuaBingInterface) {super(shouZhuaBingInterface);}@Overridepublic String getDesc() {String desc = "鸡蛋" + super.getDesc();return desc;}@Overridepublic int getPrice() {int price = 2 + super.getPrice();return price;}
}
香肠装饰:
public class SausageDeractor extends Deractor {public SausageDeractor(ShouZhuaBingInterface shouZhuaBingInterface) {super(shouZhuaBingInterface);}@Overridepublic String getDesc() {return "香肠" + super.getDesc();}@Overridepublic int getPrice() {return 5 + super.getPrice();}
}
现在我们可以测试一下 这个装饰者模式设计的代码有没有作用:
public class DeractorTest {public static void main(String[] args) {ShouZhuaBingInterface shouZhuaBing = new ShouZhuaBing();System.out.println(shouZhuaBing.getDesc() + shouZhuaBing.getPrice());EggDeractor eggDeractor = new EggDeractor(shouZhuaBing);System.out.println(eggDeractor.getDesc() + eggDeractor.getPrice());SausageDeractor sausageDeractor = new SausageDeractor(shouZhuaBing);System.out.println(sausageDeractor.getDesc() + sausageDeractor.getPrice());SausageDeractor sausageDeractor1 = new SausageDeractor(eggDeractor);System.out.println(sausageDeractor1.getDesc() + sausageDeractor1.getPrice());}
}
输出:
手抓饼5
鸡蛋手抓饼7
香肠手抓饼10
香肠鸡蛋手抓饼12