我试图了解我是否正确使用了Decorator模式,或者其他模式是否更适合这种情况:
没有重新定义我的界面,我无法装饰一个函数,因为它的父级定义阻止了我这样做。我不确定我的问题是否明确,所以也许举个例子:
interface IFoo
{
public function bar();
}
class ConcreteFoo implements IFoo
{
public function bar()
{
echo "hello world!\n";
}
}
abstract class Decorator implements IFoo
{
public function __construct(IFoo $foo)
{
$this->foo = $foo;
}
public function bar()
{
$this->foo->bar();
}
}
class BeautifulDecorator extends Decorator
{
public function bar()
{
// I am unable to insert 'beautiful' between 'hello' and 'world' without redefining the bar() function again
parent::bar();
}
}
为简单起见,如果不重新定义bar功能,基本上就无法打印出“ hello beautiful world”之类的东西。
是否可以使用Decorator模式执行此操作,还是可以使用其他模式?
答案 0 :(得分:0)
在以下情况下使用装饰器
您希望对象在执行方法之前和之后执行其他操作
通过子类扩展可以导致子类爆炸,以支持每种操作组合
在您的情况下,您不想在之前或之后 添加任何其他操作,但实际上您想< strong>替换该方法的算法,所以这不是装饰器的意图
如果该类阻止您更改其算法,则在您的示例中,除了“ hello world!”之外,没有其他方法可以要求对象打印任何内容,因此这意味着该行为被封装到对象中,并且在那里没有旨在破坏封装的模式。
我相信这里唯一的解决方案是更改ConcreteFoo实现或仅创建另一个具体类。