Java SE的裝飾模式 首先從語義上理解一下什么是裝飾模式: 簡單一點(diǎn),就拿女孩兒的打扮吧,最基本的吧,衣服是必須的。其它剩下的都是裝飾了,比如說耳環(huán)、戒指、發(fā)卡等。。。那么這些裝飾品的共同特點(diǎn)就是時用性(注意是時間的時哦),也就是說我們拿來了就可以用了。 回歸正題,理解一下java中的裝飾模式,其實(shí)其本質(zhì)都是一樣的,就是為了實(shí)現(xiàn)一種拿來就用的目的。那么我們就需要為每一個裝飾品定義一個實(shí)現(xiàn)類,但是有一個情況出現(xiàn)了,如果我們這些類沒有組織,那么在使用的時候必須都根據(jù)類的名字生成其對象,對用戶而言有太多的類名,沒有同一的名字(例如:耳環(huán)、手鐲等都屬于首飾,那么首飾就是一個同一的名字),那么我們就可以讓這些具有具體價值、作用的類都繼承自同一個類,根據(jù)java的多態(tài)特性,就很容易實(shí)現(xiàn)對用戶展示同一個類的名字。 下面是張龍老師對此的講解: 裝飾模式又名包裝(Wrapper)模式 裝飾模式以對客戶端透明的方式擴(kuò)展對象的功能,是繼承關(guān)系的一個替代方案 裝飾模式以對客戶透明的方式動態(tài)的給一個對象附加上更多的責(zé)任。換言之,客戶端并不會覺得對象在裝飾前和裝飾后有什么不同。 裝飾模式可以在不創(chuàng)造更多子類的情況下,將對象的功能加以擴(kuò)展。 裝飾模式把客戶端的調(diào)用委派到被裝飾類。裝飾模式的關(guān)鍵在于這種擴(kuò)展完全是透明的。 裝飾模式是在不必改變原類文件和使用繼承的情況下,動態(tài)的擴(kuò)展一個對象的功能。它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實(shí)的對象。 裝飾模式的角色: –抽象構(gòu)件角色(Component):給出一個抽象接口,以規(guī)范準(zhǔn)備接收附加責(zé)任的對象。 –具體構(gòu)件角色(ConcreteComponent):定義一個將要接收附加責(zé)任的類。 –裝飾角色(Decorator):持有一個構(gòu)件(Component)對象的引用,并定義一個與抽象構(gòu)件接口一致的接口 –具體裝飾角色(Concrete Decorator):負(fù)責(zé)給構(gòu)件對象“貼上”附加的責(zé)任。 用語言太難表達(dá),還是看代碼吧: package dong.application.decorate; public interface Component { publicvoid doSomething(); }
package dong.application.decorate; public class ConcreteComponent implements Component { @Override publicvoid doSomething() { System.out.println("MethodA"); } }
package dong.application.decorate; public class Decorator implements Component { privateComponent component;
publicDecorator(Component component) { this.component= component; } @Override publicvoid doSomething() { component.doSomething(); } }
package dong.application.decorate; public class ConcreteComponent1 extendsDecorator implements Component { publicConcreteComponent1(Component component) { super(component); } @Override publicvoid doSomething() { super.doSomething();
doAnotherThing(); } privatevoid doAnotherThing() { System.out.println("MethodB"); } }
package dong.application.decorate; public class ConcreteComponent2 extendsDecorator implements Component { publicConcreteComponent2(Component component) { super(component); } @Override publicvoid doSomething() { super.doSomething(); this.doAnotherThing(); } privatevoid doAnotherThing() { System.out.println("MethodC"); } }
package dong.application.decorate; public class Clent { publicstatic void main(String[] args) { Componentcomponent = new ConcreteComponent(); Componentcomponent1 = new ConcreteComponent1(component); Componentcomponent2 = new ConcreteComponent2(component1); component2.doSomething(); } }
輸出結(jié)果: MethodA MethodB MethodC 分析一下其執(zhí)行流程,加深對裝飾模式的理解。 當(dāng)執(zhí)行到主函數(shù)的:component2.doSomething();時會去執(zhí)行component1.doSomething(),然后會進(jìn)入到component.doSomething(),此時輸出MethodA,然后執(zhí)行component1.doAnotherthing(),此時輸出MethodB,然后執(zhí)行component2.doAnotherthing()輸出Method C。 容易知道,它是按照包裝的順序執(zhí)行的,包裝在最內(nèi)層的最先執(zhí)行。然后由內(nèi)向外依次執(zhí)行。 |
|