舉個例子:在電影《變形金剛2》中,擎天柱獲得了黑金剛的飛行能力,可以變形成灰機。但是,變形成灰機後的擎天柱還是擎天柱,並不是灰機。所以在定義被裝飾後的擎天柱時,要用變形金剛介面來指定物件,而不能用被裝飾後的型別指定物件。
transformer 擎天柱 = new 擎天柱();
transformer 能變飛機的擎天柱 = new 變飛機裝飾類(擎天柱); // 這樣是對的
變飛機裝飾類 能變飛機的擎天柱 = new 變飛機裝飾類(擎天柱); // 這樣從理論上說,是不對的,因為擎天柱不是擎天柱,而永遠的變成飛機了,擎天柱成霸天虎了。。。
但是在現實中,我們通常只需要用到被裝飾後的某個功能,如,只需要擎天柱被裝飾後的變飛機功能,而不需要別的。那麼transformer是沒有變飛機功能的,就只能靠被裝飾後的planedecorator物件來達到目的
transformer 擎天柱 = new 擎天柱();
變飛機裝飾類 能變飛機的擎天柱 = new 變飛機裝飾類(擎天柱);
能變飛機的擎天柱.變飛機(); // 這樣,擎天柱就可以單獨完成變飛機的動作了,而不必變成汽車後再變成飛機,帶著4個車輪子在天上飛。
上面的第二種情況就是半透明裝飾模式,他們的主要區別在客戶端的呼叫上,與被裝飾類的內部。具體**如下。
/**
* 變形金剛介面
* oct 28, 2011
* @author 車前猛跑
*/public inte***ce transformer
/**
* 擎天柱,會動,會變形成大卡車
* oct 28, 2011
* @author 車前猛跑
*/public class optimusprime implements transformer
@override
public void transform()
}
/**
* 抽象裝飾模組
* oct 28, 2011
* @author 車前猛跑
*/public class decoratortransformer implements transformer
public decoratortransformer (transformer transformer)
@override
public void move()
@override
public void transform()
}
注意:下面是符合透明性要求的裝飾類與客戶端呼叫
/**
* 擎天柱獲得黑金剛的飛行能力
* oct 28, 2011
* @author 車前猛跑
*/public class planedecorator extends decoratortransformer
public planedecorator (transformer transformer)
@override
public void move()
@override
public void transform()
public void transformplane ()
}
/**
* * oct 28, 2011
* @author 車前猛跑
*/public class ex
}
執行結果如下:
我是擎天柱,我在動
變形成飛機
----------
我是擎天柱,變成大卡車
變形成飛機
這裡可以看出,擎天柱變形飛機之前,要先動,或者先變形成汽車,這樣顯然不合理
注意:下面是半透明裝飾類與客戶端呼叫
/**
* 擎天柱獲得黑金剛的飛行能力
* oct 28, 2011
* @author 車前猛跑
*/public class planedecorator extends decoratortransformer
public planedecorator (transformer transformer)
/*@override
public void move()
@override
public void transform() */
public void transformplane ()
}
/**
* * oct 28, 2011
* @author 車前猛跑
*/public class ex
}
執行結果如下:
我是擎天柱,我在動
----------
我是擎天柱,變成大卡車
----------
變形成飛機
這裡的擎天柱,可以單獨對待每一項功能,變形成汽車,動動,變形成灰機。
設計模式之裝飾模式
有時如果需要對某乙個類增加乙個功能,可以使用繼承來實現。但是如果想要只是對某乙個物件來增加一項功能,則可能會用到裝飾模式。裝飾模式的主要作用是動態的給某乙個物件新增某些功能。如果此時使用繼承來新增功能時,會產生大量的子類,導致難以維護。裝飾模式的簡要類圖如下 其中 component為待增加功能 即...
設計模式之裝飾模式
template pattern 即模板模式 核心思想 產品不變的部分首先實現,將易變的部分抽象出來供子類完成。例如 一雙運動鞋大體製作流程各廠家基本一致,但是各環節實現細節可有些不一樣,不一樣的部分抽象出來讓不同廠家實現。即先有個框架,細節交給不同廠家實現 程式設計例項 趙本山小品中提到的將大象裝...
設計模式之裝飾模式
裝飾模式 decorator 動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。裝飾模式是利用setcomponent來對物件進行包裝的。這樣每個裝飾物件的實現就和如何使用這個物件分離開了,每個裝飾物件只關心自己的功能,不需要關係如何被新增到物件鏈當中。如果只有乙個co...