裝飾模式屬於結構型模式
java
裝飾模式動態的給一個對象添加一些額外的職責。就增長功能來講,decorator模式相比生成子類更加靈活
ide
適用性測試
在不影響其餘對象的狀況下,以動態、透明的方式給單個對象添加職責this
處理那些能夠撤銷的職責spa
當不能採用生成子類的方法進行填充時。指針
結構:code
Component定義一個對象接口,能夠給這些對象動態的添加職責。component
ConcreteComponent定義一個對象,能夠給這個對象添加一些職責。對象
Decorator維持一個紙箱Component對象的指針,並定義一個與Component接口一致的接口。繼承
ConcreteDecorator向組件添加職責。
好處
把類的核心職責和裝飾功能區分開了。能夠去除相關類中的重複的裝飾邏輯。裝飾類之間要彼此獨立。
比繼承更多的靈活性。
在運行時選擇不一樣的裝飾器,擴展對象的功能,增長了靈活性。
經過裝飾類的排列組合,能夠創造出不一樣行爲組合,獲得功能更強大的對象。
缺點
順序很重要,不留神可能會出現遞歸死循環的狀況。
會產生不少小對象,增長了系統複雜性。
出錯時,逐級排查可能會很麻煩(因此不一樣裝飾器必定要負責不一樣的行爲,這樣便於區分)
符合開閉原則。迪米特法則。
我的 感受裝飾模式就是把聲明好的類當作另外一個類的元素,遞歸的調用全部父元素到子元素的同一個方法。
BufferedReader等io流用的就是裝飾模式,有興趣的小夥伴能夠看看源碼研究下。
測試代碼1以下,
public class ZhuangshiMoshiTest2 { public static void main(String[] args) { Man man=new Man(); ManDecoratorA decoratorA=new ManDecoratorA(); ManDecoratorB decoratorB=new ManDecoratorB(); decoratorA.setPerson(man); decoratorB.setPerson(decoratorA); decoratorB.eat(); } } interface Human{ void eat(); } class Man implements Human{ @Override public void eat() { System.out.println("男人在吃"); } } abstract class Decorator implements Human{ protected Human person; public void setPerson(Human person) { this.person = person; } @Override public void eat() { person.eat(); } } class ManDecoratorA extends Decorator{ @Override public void eat() { super.eat(); reEat(); } private void reEat() { System.out.println("再吃頓"); } } class ManDecoratorB extends Decorator{ @Override public void eat() { super.eat(); System.out.println("====="); System.out.println("B"); } }
2.測試代碼2以下
public class ZhuangshimoshiTest { public static void main(String[] args) { ConcreateComponent component = new ConcreateComponent() { }; ConcreateComponent component2 = new ConcreateDecorationA(); ConcreateComponent component3 = new ConcreateDecorationB(); component2.setComponent(component); component3.setComponent(component2); component3.operation(); } } abstract class Component { public abstract void operation(); } abstract class ConcreateComponent extends Component { protected Component component; public void setComponent(Component component) { this.component = component; } @Override public void operation() { if (component != null) { component.operation(); } } } class ConcreateDecorationA extends ConcreateComponent { private String addedState;// 本類獨有的成員,能夠區別去其餘類 @Override public void operation() { super.operation(); addedState = "New state"; System.out.println("裝飾類A進行裝飾"); } } class ConcreateDecorationB extends ConcreateComponent { @Override public void operation() { super.operation(); addMethod(); System.out.println("裝飾類B進行裝飾"); } private void addMethod() {// 類B獨有的方式,能夠區別其餘類 } }
3.組合模式和裝飾模式同屬結構型模式,組合模式是一種樹形結構,而裝飾者模式是一種鏈表結構。感受有一點類似。下節會介紹組合模式以及組合模式與裝飾模式的區別。
4.命令模式、職責鏈模式雖然屬於行爲型模式,但他們和裝飾模式也有一點類似。後面也會一一介紹。敬請期待。
5.最近動力有點不足,沒有作到一天一篇,自責下。另外在公司一直在作些改改模版增刪改查的東西,事情不少尚未含金量,因此很煩。不忘初心吧。共勉。