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