【问题标题】:What is meant by run time dynamically in Decorator Design pattern?装饰器设计模式中动态运行时是什么意思?
【发布时间】:2019-04-01 05:22:57
【问题描述】:
在研究不止一篇关于装饰器设计模式的文章时,我注意到所有文章都在谈论装饰器使我们能够在运行时动态创建附加功能并在运行时动态创建对象。
我完全理解装饰器模式,但我不明白“动态”是什么意思,如果它不是在运行时创建的,它是如何创建的?
我需要一个例子来说明。
Decorator 解决的问题是您可以动态地从对象中添加和删除职责,但这样做的方式要使其与应用程序的其余代码保持兼容。
继承是您需要时想到的第一个解决方案
扩展类行为。但是,继承是静态的。你可以
在已经编译的程序中不要添加新的子类,并且
已执行。Ref
第三个问题:我需要一篇文章或描述,例如,这是一种在运行时生成的对象,这是一种动态生成的方法,但不是
问题 4:如何区分这段代码是在运行时生成的还是不是动态生成的?
参考:
- Tutsplus
- Laracsts video
- Wiki
【问题讨论】:
标签:
php
design-patterns
dynamic
runtime
decorator
【解决方案1】:
我希望我能通过展示装饰(动态)和继承(静态)之间的区别来回答你的 4 个问题。
继承(静态)= 不太灵活。假设您有继承类A 的类B。然后在运行时,类B 的每个 实例将使用类A 的代码。程序运行时无法更改此设置。要更改它,您必须在编译时进行。
装饰(动态)= 更灵活。 B 类不将 A 类视为父类,而是将 A 视为朋友。这通常通过使用称为依赖注入的技术来实现:B 的构造函数接收属于类型A 的对象。当你想创建B 的实例时,你必须首先创建A 或A 的任何子类的实例,并将其传递给B 的构造函数。这种设计更灵活但也更复杂。
【解决方案2】:
我应该指出 Pattern 是 Decorator 而不是 Decoration,我已经相应地编辑了文本。
几个经典模式,找到比继承更好的方法来改变类的行为方式。例如Strategy、Composite、Chain of Responsibility,当然还有Decorator。事实上,上述 3 项通过创建对象的链接列表来工作,这些对象协作完成一些“复杂”的事情,这将难以使用继承效率低下。使用这些模式,您可以组合对象集合,通过加入/注入多个对象在运行时执行复杂的行为。
所有这一切的重点是,您可能在编译时不知道需要什么复杂的行为,它可能取决于输入和配置等。这需要一种灵活的方式来在运行时实例化和组合类,以一种方式在编译时几乎是不可能的。
您问题中引用的作者表达了同样的意思。即,继承并不是构建复杂行为的灵活方式,这种行为可能要到运行时才能知道。