我看到一个教程视频解释了责任链设计模式,我想我理解它是如何工作的,但我不确定我什么时候会真正使用它。责任链的一些常见用法是什么?
1 回答
来自GoF:
已知用途
一些类库使用责任链模式来处理用户事件。它们对 Handler 类使用不同的名称,但想法是相同的:当用户单击鼠标或按下某个键时,将生成一个事件并沿链传递。MacApp [App89] 和 ET++ [WGM88] 将其称为“EventHandler”,赛门铁克的 TCL 库 [Sym93b] 将其称为“Bureaucrat”,而 NeXT 的 AppKit [Add94] 使用名称“Responder”。
图形编辑器的 Unidraw 框架定义了将请求封装到 Component 和 ComponentView 对象 [VL90] 的 Command 对象。命令是组件或组件视图可以解释命令以执行操作的意义上的请求。这对应于实现中描述的“请求作为对象”方法。组件和组件视图可以分层构造。组件或组件视图可以将命令解释转发给其父级,后者又可以将其转发给其父级,依此类推,从而形成责任链。
ET++ 使用责任链来处理图形更新。图形对象在必须更新其外观的一部分时调用 InvalidateRect 操作。图形对象本身无法处理 InvalidateRect,因为它对其上下文知之甚少。例如,图形对象可以包含在转换其坐标系的 Scrollers 或 Zoomers 等对象中。这意味着对象可能会被滚动或缩放,以使其部分不在视野范围内。因此 InvalidateRect 的默认实现将请求转发到封闭的容器对象。转发链中的最后一个对象是 Window 实例。到 Window 收到请求时,可以保证正确转换无效矩形。