gpt4 book ai didi

design-patterns - 装饰器设计模式

转载 作者:行者123 更新时间:2023-12-04 07:20:48 25 4
gpt4 key购买 nike

我刚开始学习设计模式,我有两个与装饰器相关的问题......

我想知道为什么装饰器模式建议装饰器实现它装饰的组件的所有公共(public)方法?

装饰器类不能只用来提供额外的行为,然后具体组件(传递给它)只用来调用其他所有东西吗?

其次,如果您要装饰的具体组件没有抽象装饰器也可以派生的基类怎么办?

提前致谢!

最佳答案

我想你误解了装饰器。您正在考虑扩展具有附加功能的具体类的简单案例。在这种情况下,是的,在大多数 OO 语言中,派生类可以简单地允许其父类(super class)处理任何未实现的方法。

class Base {

function foo() {
return "foo";
}

function bar() {
return "bar";
}

}

// Not what we think of as a Decorator,
// really just a subclass.
class Decorator extends Base {

// foo() inherits behavior from parent Base class

function bar() {
return parent::bar() . "!"; // add something
}

}

Decorator 类不扩展其“装饰”类的基类。它是一个不同的类型,它有一个被装饰类的成员对象。因此它必须实现相同的接口(interface),即使只是调用被装饰对象的相应方法。
class Decorator { // extends nothing
protected $base;

function __construct(Base $base) {
$this->base = $base;
}

function foo() {
return $base->foo();
}

function bar() {
return $base->foo() . "!"; // add something
}

}

为装饰类和装饰类定义一个接口(interface)(如果你的语言支持这样的东西)可能是值得的。这样,您可以在编译时检查装饰器是否实现了相同的接口(interface)。
interface IBase {
function foo();
function bar();
}

class Base implements IBase {
. . .
}

class Decorator implements IBase {
. . .
}

回复:@Yossi Dahan 的评论:我在维基百科文章中看到了歧义,但如果你仔细阅读,它确实说被装饰的组件是装饰器对象中的一个字段,并且该组件作为参数传递给装饰器构造函数.这与继承不同。

尽管维基百科文章确实说装饰器继承自组件,但您应该将其视为实现接口(interface),正如我在上面的 PHP 示例中所示。装饰器仍然必须代理组件对象,如果它继承了它就不会。这允许装饰器装饰任何实现该接口(interface)的类的对象。

以下是 Gamma、Helm、Johnson 和 Vlissides 的“设计模式:可重用的面向对象软件的元素”的一些节选:

Decorator

Intent

Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

Motivation

... A decorator conforms to the interface of the component it decorates so that its presence is transparent to the component's clients.

Participants

  • Decorator maintains a reference to a Component object and defines an interface that conforms to Component's interface.

关于design-patterns - 装饰器设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/505641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com