装饰者模式(Decorator Pattern)是指在不改变元祐对象的基础上将功能附加到对象上,提供了比继承更有弹性的方案(即扩展原有对象的功能),属于结构型模式。装饰者模式适用于以下场景:
- 扩展一个类的功能或给一个类添加附加的职责。
- 动态的给一个对象添加功能,这些功能可以再动态地撤销。
以日常生活中一个小例子来讲解装饰者模式的应用。如:我们在平时的上班的早上,很多人可能都是起的比较晚,走在路上随便买点煎饼来对付。
1、首先创建一个煎饼的抽象类
public abstract class Battercake {
protected abstract String getMsg();
protected abstract int getPrice();
}
2、创建一个基本的煎饼类
public class BaseBattercake extends Battercake {
@Override
protected String getMsg() {
return "煎饼果子";
}
@Override
protected int getPrice() {
return 5;
}
}
3、创建一个抽象的套餐装饰者类(为什么要创建这个呢?因为有人要加鸡蛋,有人要加火腿,有人要加多个[不固定])
public abstract class BattercakeDecorator extends Battercake {
/** 静态代理 */
private Battercake battercake;
public BattercakeDecorator(Battercake battercake) {
this.battercake = battercake;
}
@Override
protected String getMsg() {
return this.battercake.getMsg();
}
@Override
protected int getPrice() {
return this.battercake.getPrice();
}
}
4、创建一个加鸡蛋的煎饼装饰器
public class EggDecorator extends BattercakeDecorator {
public EggDecorator(Battercake battercake) {
super(battercake);
}
@Override
protected String getMsg() {
return super.getMsg() + "+1个鸡蛋";
}
@Override
protected int getPrice() {
return super.getPrice() + 1;
}
}
5、创建一个加火腿的装饰器
public class SausageDecorator extends BattercakeDecorator {
public SausageDecorator(Battercake battercake) {
super(battercake);
}
@Override
protected String getMsg() {
return super.getMsg() + "+1个火腿";
}
@Override
protected int getPrice() {
return super.getPrice() + 2;
}
}
6、所有的步骤都已经写完了,现在用一个测试类来测试是否有效。
public class Test {
public static void main(String[] args) {
Battercake battercake = null;
// 基本套餐
battercake = new BaseBattercake();
// 加一个鸡蛋
battercake = new EggDecorator(battercake);
// 加个火腿
battercake = new SausageDecorator(battercake);
// 再加个鸡蛋
battercake = new EggDecorator(battercake);
System.out.println(battercake.getMsg() + ",总价格:" + battercake.getPrice());
}
}
打印的结果如下:
煎饼果子+1个鸡蛋+1个火腿+1个鸡蛋,总价格:9
从上面的打印结果可知,装饰者模式的作用为动态的添加或者或者撤销某一项功能。由于每人的要求不同,从而可以根据各自的要求制定相应的计划获得需要的结果。
而在次示例中,原有的煎饼类BaseDecorator 并没有改变,当我们想要一些新的功能的时候只需要利用一个装饰器就可以了,这就是装饰器模式独特的地方。