在研究不止一篇关于Decorator Design Pattern的文章时,我注意到所有的文章都谈到了Decorator使我们能够在运行时动态创建附加功能,并在运行时创建对象。
我完全理解Decorator模式,但我不明白"动态"是什么意思,如果它不是在运行时创建的,它是如何创建的?我需要一个例子来说明。
Decorator解决的问题是,您可以动态地添加和删除对象的责任,但这样做的方式要使它与应用程序的其余代码保持兼容。
当您需要扩展类行为。但是,继承是静态的。你可以当程序已经编译并且已执行。参考
第三个问题:我需要一篇文章或描述,例如,这是一种在运行时生成对象的方式,这是它动态生成的方式,而不是
问题4:如何区分此代码是否在运行时生成和动态生成?
参考:
- Tutspus
- Laracsts视频
- Wiki
我希望我能通过展示装饰(动态(和继承(静态(之间的区别来回答您的4个问题。
继承(静态(=灵活性较低。假设您有继承类A
的类B
。然后在运行时,类B
的每个实例都将使用类A
的代码。程序运行时无法更改此项。要更改它,您必须在编译时进行。
装饰(动态(=更灵活。类B
不将类A
视为父类,而是将A
视为朋友。这通常通过使用一种名为依赖注入的技术来实现:B
的构造函数接收属于类型A
的对象。当您想要创建B
的实例时,您必须首先创建A
或A
的任何子类的实例,并将其传递给B
的构造函数。这种设计更灵活,但也更复杂。
我应该指出Pattern是Decorator
而不是Decoration
,并且我已经相应地编辑了文本。
一些经典模式找到了比继承更好的方法来改变类的行为方式。例如Strategy
、Composite
、Chain of Responsibility
,当然还有Decorator
。事实上,上面的3项工作是通过制作对象的链表来完成的,这些对象协作来做一些"复杂"的事情,这将是一种低效的继承。使用这些模式,您可以通过连接/注入多个对象来组成对象集合,以便在运行时执行复杂的行为。
所有这些的重点是,在编译时你可能不知道需要什么复杂的行为,它可能取决于输入和配置等。这需要一种灵活的方式来在运行时实例化和组合类,而这种方式在编译时几乎是不可能的。
你问题中引用的话的作者表达了同样的观点。即继承并不是一种灵活的方式来构建复杂的行为,这些行为可能要到运行时才能知道。