裝飾者模式(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 並沒有改變,當我們想要一些新的功能的時候只需要利用一個裝飾器就可以了,這就是裝飾器模式獨特的地方。