淺談裝飾器設計模式
一、概念
《Thinking in Java》: 裝飾器模式使用分層對象來動態透明地向單個對象中添加責任。裝飾器指定包裝在最初地對象周圍地所有對象都具有相同的基本接口。某些事物是可裝飾的,可以通過將其它類包裝在這個可裝飾對象的四周,從而將功能分層,這使得對裝飾器的使用是透明的——無論對象是否被裝飾,你都擁有一個可以向對象發送的公共消息集。
二、結構
結構如下圖所示(圖片來源於互聯網):
在裝飾器模式中有如下一系列角色:
- 抽象構件角色(component):給出抽象接口,規範準備接收附加責任的對象;
- 具體構件角色(Concrete Component):定義一個將要接收附加責任的對象:
- 裝飾角色(Decorator):持有一個構件對象的實例,並且實現了抽線構件規定的接口;
- 具體裝飾角色(Concrete Decorator):負責給構件對象增加附加的責任;
如何理解裝飾器設計模式的運行原理?
在上圖中,ConcreteDecoratorA與ConcreteDecoratorB都是具體裝飾器,它們的構造函數接收一個具體構件(Concrete Component)角色對象,由於具體裝飾器器繼承自裝飾角色,其內部都聲明瞭一個能夠指向具體構件的變量,因此該變量最後會指向我們向裝飾器傳遞的具體構件的對象,而具體裝飾器角色對象也有具體構件角色的接口(這就是抽象構件角色所起到的作用之一,規範接口),因此,裝飾器就可以調用具體構件的接口了,並且,還可以增加功能。
下面給出一個簡單的示例
抽象構件
public interface Component{
public void operation();
}
裝飾角色
public class Decorator implements Component{
protected Component component;
public Decorator(Component component){
this.component = component;
}
@override
public void operation(){
// 可以增加功能,調用具體構件的接口
component.operation();
}
}
具體裝飾器角色
pubic class SpecialDecorator extends Decorator{
public SpecialDecorator(Component component){
super(component);
}
@override
public void operation(){
// 可以增加功能,也可以調用具體構件接口
super.operation();
System.out.print("我是具體裝飾器角色增加的功能");
}
}
具體構件角色
public class ConcreteComponent implements Component{
@override
public void operation(){
// 業務代碼
}
}