在研究不止一篇有关Decorator Design Pattern的文章时,我注意到所有文章都涉及Decorator,使我们能够在运行时动态创建其他功能并在运行时动态创建对象。
我完全理解Decorator模式,但是我不理解“动态”的含义,如果它不是在运行时创建的,那么它是如何创建的? 我需要一个例子来说明。
Decorator解决的问题是,您可以动态地添加和删除对象的职责,但是要以某种方式做到,使其与应用程序的其余代码保持兼容。
继承是您需要时想到的第一个解决方案 扩展课堂行为。但是,继承是静态的。您可以 当已经被编译时,不向程序添加新的子类,并且 已执行。Ref
第三个问题:例如,我需要一篇文章或说明,这是对象是否在运行时创建的方式,这是它动态创建的方式,而不是
问题4 :如何区分此代码是在运行时生成还是动态生成?
参考:
答案 0 :(得分:0)
我希望我能通过展示装饰(动态)和继承(静态)之间的区别来回答您的4个问题。
继承(静态)=不够灵活。假设您有一个类B
继承了类A
。然后在运行时,类B
的每个实例将使用类A
的代码。程序运行时无法更改此设置。要对其进行更改,必须在编译时进行。
装饰(动态)=更灵活。类B
不会将类A
视为父类,而是将A
视为朋友。这通常是通过使用一种称为 Dependency Injection 的技术来实现的:B
的构造函数接收属于A
类型的对象。当您要创建B
的实例时,必须首先创建A
或A
的任何子类的实例,并将其传递给B
的构造函数。这种设计更加灵活,但也更加复杂。
答案 1 :(得分:0)
我应该指出,模式是Decorator
而不是Decoration
,我已经相应地编辑了文本。
几种经典模式,找到比继承更好的方法来改变类的行为。示例为Strategy
,Composite
,Chain of Responsibility
,当然还有Decorator
。实际上,以上方法中的第3个工作是通过创建对象的链接列表来完成的,这些对象协作完成“复杂”的事情,而这将很难有效地利用继承。使用这些模式,您可以组成对象的集合,以通过加入/注入多个对象来在运行时执行复杂的行为。
所有这些的要点是,您可能在编译时不知道需要什么复杂的行为,并且它可能取决于输入和配置等。这需要一种灵活的方式在运行时实例化和组合类。在编译时几乎是不可能的。
您所提问题的引文作者也表达了同样的意思。即,继承只是构建复杂行为的灵活方式,这种行为直到运行时才可能知道。