裝飾模式之半透明裝飾模式

2021-06-01 07:07:54 字數 2672 閱讀 1783

舉個例子:在電影《變形金剛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...