定義:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。 裝飾器模式是為已有功能添加更多功能的一種方式,就增加功能來說,裝飾器模式比通過生成子類更為靈活。該模式通過將裝飾的功能放在單獨的類中,並讓這些類包含了需要進行裝飾的 ...
定義:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
裝飾器模式是為已有功能添加更多功能的一種方式,就增加功能來說,裝飾器模式比通過生成子類更為靈活。該模式通過將裝飾的功能放在單獨的類中,並讓這些類包含了需要進行裝飾的對象,使得客戶端代碼能夠有選擇性和順序性來裝飾對象,這能夠將客戶端中裝飾功能代碼移到單獨的類中,使客戶端的核心職責與裝飾功能區分開來的同時不需要在客戶端中編寫重覆的裝飾邏輯。以下是裝飾器模式的結構類圖
可以看出,Component是一個對象介面,它的實現主要有兩種,一個是需要被裝飾的對象ConcreteComponent,一個是裝飾抽象類Decorator,ConcreteDecoratorA和B是具體的裝飾對象用來給Component添加功能,來看下以上類圖的代碼實現
Component介面
public interface Component { void decoration(); }
ConcreteComponent類
public class ConcreteComponent implements Component { @Override public void decoration() { System.out.println("未裝飾的操作"); } }
Decorator抽象類
public abstract class Decorator implements Component { protected Component component; public Decorator(Component component) { super(); this.component = component; } @Override public void decoration() { if (component != null) { component.decoration(); } } }
兩個具體的抽象類
public class ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component component) { super(component); } @Override public void decoration() { System.out.println("裝飾A之前"); super.decoration(); System.out.println("裝飾A之後"); } public void decorationA() { System.out.println("裝飾A之後擴展的方法"); } }
public class ConcreteDecoratorB extends Decorator { public ConcreteDecoratorB(Component component) { super(component); } @Override public void decoration() { System.out.println("裝飾B之前"); super.decoration(); System.out.println("裝飾B之後"); } public void decorationB() { System.out.println("裝飾B之後擴展的方法"); } }
測試類的調用和輸出結果
Component component = new ConcreteComponent(); component.decoration(); System.out.println("----------------"); component = new ConcreteDecoratorA(component); component.decoration(); ((ConcreteDecoratorA) component).decorationA(); System.out.println("----------------"); component = new ConcreteDecoratorB(component); component.decoration(); ((ConcreteDecoratorB) component).decorationB();
通過以上的類圖和代碼,使我們瞭解了裝飾模式的大致結構。下麵通過實現一個簡單的角色打扮功能來加深對該模式的理解,這個功能即客戶端能有選擇性、順序性的對人物進行穿著打扮,代碼如下
人物介面
public interface Person { void show(); }
待打扮的男人類
public class Man implements Person { @Override public void show() { System.out.print("打扮的男人"); } }
用來穿著的服飾抽象類
public abstract class Finery implements Person { protected Person person; public Finery(Person person) { super(); this.person = person; } @Override public void show() { if (person != null) { person.show(); } } }
具體的服飾類(代碼只展示一種,其他類似)
public class Jeans extends Finery { public Jeans(Person person) { super(person); } @Override public void show() { System.out.print("牛仔褲 "); person.show(); } }
測試類的調用和輸出
Person man = new Man(); man = new Suit(man); man = new LeatherShoes(man); man.show(); System.out.println(); man = new Man(); man = new Shirt(man); man = new Jeans(man); man = new SportsShoes(man); man.show();
以上就是整個功能是實現代碼,可以通過點擊以下鏈接獲取代碼和類圖,java中的IO就是用裝飾器模式實現,可以參考左瀟龍的博客