Decorator Design模式中动态运行时的含义是什么



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

我完全理解Decorator模式,但我不明白"动态"是什么意思,如果它不是在运行时创建的,它是如何创建的?我需要一个例子来说明。

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

当您需要扩展类行为。但是,继承是静态的。你可以当程序已经编译并且已执行。参考

第三个问题:我需要一篇文章或描述,例如,这是一种在运行时生成对象的方式,这是它动态生成的方式,而不是

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

参考:

  1. Tutspus
  2. Laracsts视频
  3. Wiki

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

继承(静态(=灵活性较低。假设您有继承类A的类B。然后在运行时,B的每个实例都将使用类A的代码。程序运行时无法更改此项。要更改它,您必须在编译时进行。

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

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

一些经典模式找到了比继承更好的方法来改变类的行为方式。例如StrategyCompositeChain of Responsibility,当然还有Decorator。事实上,上面的3项工作是通过制作对象的链表来完成的,这些对象协作来做一些"复杂"的事情,这将是一种低效的继承。使用这些模式,您可以通过连接/注入多个对象来组成对象集合,以便在运行时执行复杂的行为。

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

你问题中引用的话的作者表达了同样的观点。即继承并不是一种灵活的方式来构建复杂的行为,这些行为可能要到运行时才能知道。

最新更新