使用装饰器模式时,如何在函数的具体定义之间修饰其他功能?

时间:2018-11-16 08:12:03

标签: design-patterns decorator

我试图了解我是否正确使用了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模式执行此操作,还是可以使用其他模式?

1 个答案:

答案 0 :(得分:0)

在以下情况下使用装饰器

  • 您希望对象在执行方法之前和之后执行其他操作

  • 通过子类扩展可以导致子类爆炸,以支持每种操作组合

在您的情况下,您不想之前或之后 添加任何其他操作,但实际上您想< strong>替换该方法的算法,所以这不是装饰器的意图

如果该类阻止您更改其算法,则在您的示例中,除了“ hello world!”之外,没有其他方法可以要求对象打印任何内容,因此这意味着该行为被封装到对象中,并且在那里没有旨在破坏封装的模式。

我相信这里唯一的解决方案是更改ConcreteFoo实现或仅创建另一个具体类。