設計模式之 - 裝飾者模式
阿新 • • 發佈:2018-11-26
一、什麼是裝飾者模式
裝飾著模式:簡單的一句話理解就是,動態的給一個物件新增一些額外的功能,裝飾者模式相對於生成子類更加的靈活。
我們來看下裝飾者模式的UML圖:
二、裝飾者模式的構成
-
Component(抽象構件):它是裝飾類和具體構件的公共父類;
-
ConcreteComponent(具體構件):具它是抽象構件物件的子類,用來定義具體的構件物件;
-
Decorator(抽象裝飾類):進繼承抽象構件,用於給具體的構件新增一些新的職責;
-
ConcreteDecoraror(具體裝飾類):實現了抽象裝飾類,它負責向構件新增新的職責;
三、例項演示
業務場景:現我們現在模擬這樣一個場景,我們點了一杯奶茶,然後給奶茶中加了冰塊,加了珍珠,最後我們還想再給加點紅豆,這裡加紅豆就使用了裝飾者。
我們下來建立一個奶茶的抽象類,想到於Component
public interface MilkyTea {
public void recipe();
}
我們再來建立要給奶茶的具體子類,相當於ConcreteComponent
public class MilkyTeaA implements MilkyTea { @Override public void recipe() { System.out.println("老闆來一杯奶茶,加冰塊"); } }
接下來建立一個裝飾類,相當於Decorator
public class Decorator implements MilkyTea {
private MilkyTea milkyTea;
public void setMilkyTea(MilkyTea milkyTea) {
this.milkyTea = milkyTea;
}
@Override
public void recipe() {
milkyTea.recipe();
}
}
建立裝飾類的子類,新增珍珠,相當於ConcreteDecorator
public class MilkyTeaADecorator extends Decorator {
@Override
public void recipe() {
super.recipe();
recipeZZ();
}
// 加珍珠
public void recipeZZ() {
System.out.println("老闆再加點珍珠吧");
}
}
建立裝飾者的子類,新增紅豆,相當於ConcreteDecorator
public class MilkyTeaBDecorator extends Decorator {
@Override
public void recipe() {
super.recipe();
recipeHD();
}
public void recipeHD() {
System.out.println("老闆你再給加點紅豆吧");
}
}
最後我們測試一下看下結果:
public class Test {
public static void main(String[] args) {
MilkyTeaA milkyTea = new MilkyTeaA();
MilkyTeaADecorator milkyTeaA = new MilkyTeaADecorator();
MilkyTeaBDecorator milkyTeaB = new MilkyTeaBDecorator();
milkyTeaA.setMilkyTea(milkyTea);
milkyTeaB.setMilkyTea(milkyTeaA);
milkyTeaB.recipe();
}
}
四、模式總結
通過這個小例子我們可以發現,裝飾者模式是為了已有的功能動態的新增更多功能的一種方式。
裝飾模式的優點:把類中的裝飾功能從類中搬移去除,這樣可以簡化原有的類;