從例子開始講解,好比今天你要出門約會,你確定是要決定好你要穿什麼樣的衣服出門,用衣服來裝飾下本身,讓本身擁有一個完美的約會。好比,你會穿一件襯衫,而後穿一件西服褲,最後穿皮鞋出門。這就是裝飾者模式的一個例子。爲了實現這個功能,會有下面的代碼。設計模式
public class People { public void wearShirt(){ System.out.println("******穿襯衫******"); } public void wearTrouser(){ System.out.println("******穿西服褲******"); } public void wearShoes(){ System.out.println("******穿皮鞋******"); } }
public class Client { public static void main(String[] args) { People people = new People(); people.wearShirt(); people.wearTrouser(); people.wearShoes(); } }
雖然上面的代碼實現了出門穿衣服的功能,可是這裏會問題。若是我如今要增長一個功能,我要先穿襪子,再穿皮鞋。此時就要在People類中增長一個穿襪子的方法。這就違背了設計模式的開閉原則,所謂開閉原則就是類能夠進行擴展,可是不能夠進行修改。因此就有以下的設計:ide
public interface People { public void wearClothing(); }
public class Xiaoming implements People{ private String name; public Xiaoming(){ name = "小明"; } public void wearClothing(){ System.out.println(name+"******開始穿衣服******"); } public String getName() { return name; } }
public abstract class Finery implements People { protected People people; public Finery(People people){ this.people = people; } public abstract void wearClothing(); }
public class ShirtFinery extends Finery { public ShirtFinery(People people){ super(people); } @Override public void wearClothing() { people.wearClothing(); System.out.println("******穿襯衫******"); } }
public class ShoesFinery extends Finery { public ShoesFinery(People people){ super(people); } @Override public void wearClothing() { people.wearClothing(); System.out.println("******穿皮鞋*******"); } }
public class TrouserFinery extends Finery { public TrouserFinery(People people){ super(people); } @Override public void wearClothing() { people.wearClothing(); System.out.println("******穿西服褲*******"); } }
public class Client { public static void main(String[] args) { People people = new Xiaoming(); Finery shirtFinery = new ShirtFinery(people); Finery trouserFinery = new TrouserFinery(shirtFinery); Finery shoesFinery = new ShoesFinery(trouserFinery); shoesFinery.wearClothing(); } }
裝飾者模式共有四大角色:this
Component:抽象組件設計
能夠是一個接口或者是抽象類,其充當的就是被裝飾的原始對象,用來定義裝飾者和被裝飾者的基本行爲。code
ConcreteComponent:組件具體實現類對象
該類是 Component 類的基本實現,也是咱們裝飾的具體對象。繼承
Decorator:抽象裝飾者接口
裝飾組件對象,其內部必定要有一個指向組件對象的引用。在大多數狀況下,該類爲抽象類,須要根據不一樣的裝飾邏輯實現不一樣的具體子類。固然,若是是裝飾邏輯單一,只有一個的狀況下咱們能夠忽略該類直接做爲具體的裝飾者。圖片
ConcreteDecoratorA 和 ConcreteDecoratorB:裝飾者具體實現類對抽象裝飾者的具體實現。get
在已有的 Component 和 ConcreteComponent 體系下,實現裝飾者模式來擴展原有系統的功能,能夠分爲
5 個步驟
People是定義了一個接口,用來添加具體的職責,而Xiaoming是具體的People,也就是被裝飾的對象。對於Finery實現了People接口,進而對People進行擴展,而Finery的子類就是具體的裝飾類,Finery中依賴People類,裝飾的具體對象。 這就是所謂的裝飾者模式。若是我要添加穿襪子的步驟,則只須要再添加一個實現類,徹底不須要修改其餘代碼(Client是客戶端類,確定是要修改的)。