Re: [請益] 這種情況有比 Decorator 更好的模式嗎?

作者: tails32100 (Tails)   2013-10-11 20:40:04
最近小弟有在練習OOAD,一起學習討論吧
小弟專長PHP,Java次之
※ 引述《bill42362 (酒池肉林夜夜生科)》之銘言:
: 小弟最近遇到一個設計上的瓶頸
: 目前已有架構大致如下
: A {
: methodX();
: methodA();
: }
: B {
: methodX();
: methodB();
: }
: C {
: methodX();
: methodC();
: }
: 如上,三個物件有一個名稱相同但實作不同的 methodX()
應該有個抽象類X吧?
abstract class X {
abstract methodX();
}
然後上面ABC extends X
: 並分別有名稱不同的 methodA(), methodB(), methodC()
: 現在希望為這三個物件加上一些可選擇的 methodY(), methodZ(), etc.
: 並且是在執行期間動態的加上去
所以
A有可能會有 Y
B有可能會有 Z
C有可能會有 YZ
D有可能都沒有
直覺想到能用的應該只有 Magic method (PHP) 或是 Reflection (Java)
: 1) Decorator pattern:
: 創造新的 Y, Z 物件為 drcorator,就可以用 new Y(new A()) 來達成
: 動態附加 methods.
: 缺點:這樣 Y, Z 物件要把所有的 method[A-C, Z]() 寫進去,以後要
: 增加 D 物件的話 Y, Z 物件都要修改。
小弟感覺這個 pattern 寫完並達到需求後,就失去強健性了。
: 2) Strategy pattern:
: 將實作不同的 methodX() 和 method[A-C]() 抽出來,創造一個 O 來
: 接收 strategy[A-C],將 method[YZ]() 用條件式判斷要不要執行
: O (strategy){
: methodX() { return strategy.methodX(); }
: methodY() { if(...) return _methodY(); }
: ...
: }
: 缺點:所有要動態加上的 method 都要寫在 O 裡,得到一個超龐大的 O...
小弟感覺同上。
: 請問各位這樣的情況有沒有更好的解決方法?
: 有查過 mixin pattern 但是在我使用的語言似乎沒有 native 支援的方法。
: 感謝回覆!!
PHP應該可以用 magic function 配合條件式來決定能不能執行
JAVA用 Reflection 應該會跟 PHP 的情況一樣
其他常見的 pattern 應該也都沒辦法解Orz

Links booklink

Contact Us: admin [ a t ] ucptt.com