裝飾着模式:簡單的一句話理解就是,動態的給一個對象添加一些額外的功能,裝飾者模式相對於生成子類更加的靈活。ide
咱們來看下裝飾者模式的UML圖:測試
Component(抽象構件):它是裝飾類和具體構件的公共父類;this
ConcreteComponent(具體構件):具它是抽象構件對象的子類,用來定義具體的構件對象;spa
Decorator(抽象裝飾類):進繼承抽象構件,用於給具體的構件添加一些新的職責;code
ConcreteDecoraror(具體裝飾類):實現了抽象裝飾類,它負責向構件添加新的職責;對象
業務場景:現咱們如今模擬這樣一個場景,咱們點了一杯奶茶,而後給奶茶中加了冰塊,加了珍珠,最後咱們還想再給加點紅豆,這裏加紅豆就使用了裝飾者。blog
咱們下來建立一個奶茶的抽象類,想到於Component繼承
public interface MilkyTea { public void recipe(); }
咱們再來建立要給奶茶的具體子類,至關於ConcreteComponentip
public class MilkyTeaA implements MilkyTea { @Override public void recipe() { System.out.println("老闆來一杯奶茶,加冰塊"); } }
接下來建立一個裝飾類,至關於Decoratorci
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(); } }
經過這個小例子咱們能夠發現,裝飾者模式是爲了已有的功能動態的添加更多功能的一種方式。
裝飾模式的優勢:把類中的裝飾功能從類中搬移去除,這樣能夠簡化原有的類;