裝飾模式:就是動態地給一個對象添加一些額外的職責(功能)。那麼如何動態的給一個對象添加功能呢,以下給出了例子。 測試的結果為: hatpantsT-shirt穿衣服的人 根據具體裝飾類的創建順序的改變,結果也會“動態”變化。 測試的結果為: hatT-shirtpants穿衣服的人 總結:當給一個類 ...
裝飾模式:就是動態地給一個對象添加一些額外的職責(功能)。那麼如何動態的給一個對象添加功能呢,以下給出了例子。
//Person是一個對象介面,我們的目的是給實現這個介面的對象動態的添加職責
public interface Person { //定義一了一個裝飾的方法 void decorate(); }
//實現介面的具體對象,我們現在就要給這個類“穿衣服” public class ConcretePerson implements Person { @Override public void decorate() { System.out.println("穿衣服的人"); } }
//裝飾的抽象類,使裝飾功能與主類的邏輯區分開 public abstract class Clothes implements Person { protected Person component; public Clothes(Person component){ this.component = component; } @Override public void decorate(){ if(component!=null){ component.decorate(); } } } //具體的裝飾類,給Person類添加職責 public class Tshirt extends Clothes { public Tshirt(Person component) { super(component); } @Override public void decorate() { System.out.println("T-shirt"); super.decorate(); } } public class Pants extends Clothes { public Pants(Person component) { super(component); } @Override public void decorate() { System.out.println("pants"); super.decorate(); } } public class Hat extends Clothes { public Hat(Person component) { super(component); } @Override public void decorate() { System.out.println("hat"); super.decorate(); } }
//測試類 public class Test { public static void main(String[] args) {
//動態的裝飾主類,可以選擇性的調用裝飾類,以及更改調用的順序從而實現“動態” Person person = new ConcretePerson(); Clothes tshirt = new Tshirt(person); Clothes pants = new Pants(tshirt); Clothes hat = new Hat(pants); hat.decorate(); } }
測試的結果為:
hat
pants
T-shirt
穿衣服的人
根據具體裝飾類的創建順序的改變,結果也會“動態”變化。
public class Test { public static void main(String[] args) { Person person = new ConcretePerson(); Clothes pants = new Pants(person); Clothes tshirt = new Tshirt(pants); Clothes hat = new Hat(tshirt); hat.decorate(); } }
測試的結果為:
hat
T-shirt
pants
穿衣服的人
總結:當給一個類添加在某種特殊情況才需要的方法時,我們就可以使用裝飾模式,避免使主類過於複雜,而且可以有選擇的,有順序的添加這些方法,使主類的主要邏輯和裝飾功能區分開,從而簡化主類。