在Decorator Design模式中动态运行时间是什么意思?

时间:2018-10-27 20:07:21

标签: php design-patterns dynamic runtime decorator

在研究不止一篇有关Decorator Design Pattern的文章时,我注意到所有文章都涉及Decorator,使我们能够在运行时动态创建其他功能并在运行时动态创建对象。

我完全理解Decorator模式,但是我不理解“动态”的含义,如果它不是在运行时创建的,那么它是如何创建的? 我需要一个例子来说明。

  

Decorator解决的问题是,您可以动态地添加和删除对象的职责,但是要以某种方式做到,使其与应用程序的其余代码保持兼容。

     

继承是您需要时想到的第一个解决方案   扩展课堂行为。但是,继承是静态的。您可以   当已经被编译时,不向程序添加新的子类,并且   已执行。Ref

第三个问题:例如,我需要一篇文章或说明,这是对象是否在运行时创建的方式,这是它动态创建的方式,而不是

问题4 :如何区分此代码是在运行时生成还是动态生成?

参考:

  1. Tutsplus
  2. Laracsts video
  3. Wiki

2 个答案:

答案 0 :(得分:0)

我希望我能通过展示装饰(动态)和继承(静态)之间的区别来回答您的4个问题。

继承(静态)=不够灵活。假设您有一个类B继承了类A。然后在运行时,类B每个实例将使用类A的代码。程序运行时无法更改此设置。要对其进行更改,必须在编译时进行。

装饰(动态)=更灵活。类B不会将类A视为父类,而是将A视为朋友。这通常是通过使用一种称为 Dependency Injection 的技术来实现的:B的构造函数接收属于A类型的对象。当您要创建B的实例时,必须首先创建AA的任何子类的实例,并将其传递给B的构造函数。这种设计更加灵活,但也更加复杂。

答案 1 :(得分:0)

我应该指出,模式是Decorator而不是Decoration,我已经相应地编辑了文本。

几种经典模式,找到比继承更好的方法来改变类的行为。示例为StrategyCompositeChain of Responsibility,当然还有Decorator。实际上,以上方法中的第3个工作是通过创建对象的链接列表来完成的,这些对象协作完成“复杂”的事情,而这将很难有效地利用继承。使用这些模式,您可以组成对象的集合,以通过加入/注入多个对象来在运行时执行复杂的行为。

所有这些的要点是,您可能在编译时不知道需要什么复杂的行为,并且它可能取决于输入和配置等。这需要一种灵活的方式在运行时实例化和组合类。在编译时几乎是不可能的。

您所提问题的引文作者也表达了同样的意思。即,继承只是构建复杂行为的灵活方式,这种行为直到运行时才可能知道。