裝飾者模式介紹
裝飾模式又名包裝(Wrapper)模式。裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案。就增加功能來說,Decorator模式比生成子類更為靈活。
裝飾者模式的類圖結構如下所示
裝飾者模式中類或接口的作用:
抽象構件(Component)角色:給出一個抽象接口,以規范准備接收附加責任的對象。
具體構件(ConcreteComponent)角色:定義一個將要接收附加責任的類。
裝飾(Decorator)角色:持有一個構件(Component)對象的實例,並定義一個與抽象構件接口一致的接口。
具體裝飾(ConcreteDecorator)角色:負責給構件對象“貼上”附加的責任。
下面給出裝飾者模式的示例代碼:
第一步:定義一個抽象接口,作為被裝飾的對象基類
第二部:定義被裝飾的具體對象,實現上面的接口
第三部:定義一個裝飾者的抽象類,要與被裝飾者具體對象實現同一個接口,並且要持有一個構件(Component)對象的實例
第四步:定義具體裝飾者的對象,繼承Decorator對象,並在里面定義具體的方法
第5步:測試
打印結果:
從上面的例子中,我們可以得知,男人這個對象,只有一個穿着的方法,具體穿什么無法實現,這時通過裝飾者模式,可以對Man這個對象進行裝飾,賦予具體穿什么的方法,這樣就實現了裝飾的效果。
裝飾者模式在jdk中應用體現:
最常見的在IO流中Inputstream運用了裝飾者模式;下面具體看看源碼來對比上面的示例;
首先InputStream最為被裝飾對象的基類:
FileInputStream作為具體被裝飾的對象:
FilterInputStream作為裝飾者的基類,繼承InputStream,並且持有InputStream對象的實例
BufferedInputStream作為具體的裝飾者對象,繼承了FilterInputStream,並對里面的方法進行了裝飾;