我看到一个教程视频解释了责任链设计模式,我想我明白它是如何工作的,但我不确定我什么时候会真正使用它。责任链有哪些常见用法?
答案 0 :(得分:2)
来自GoF:
已知用途
几个类库使用责任链 模式来处理用户事件。他们使用不同的名称 处理程序类,但想法是一样的:当用户点击时 鼠标或按键,一个事件生成并传递 链。 MacApp [App89]和ET ++ [WGM88]称之为“EventHandler” 赛门铁克的TCL库[Sym93b]称其为“官僚”和NeXT AppKit [Add94]使用名称“Responder。”
图形编辑器的Unidraw框架定义了Command对象 将请求封装到Component和ComponentView对象 [VL90]。命令是组件或组件的意义上的请求 组件视图可以解释执行操作的命令。这个 对应于中描述的“作为对象的请求”方法 实现。组件和组件视图可以是结构化的 分层。组件或组件视图可以转发命令 对其父母的解释,而父母可以将其转发给它 父母等等,从而形成责任链。
ET ++使用责任链来处理图形更新。一个 只要必要,图形对象就会调用InvalidateRect操作 更新其外观的一部分。图形对象无法处理 InvalidateRect本身,因为它对它的了解不够 上下文。例如,图形对象可以包含在对象中 像Scrollers或Zoomers一样改变它的坐标系。那 表示对象可能会滚动或缩放,因此它是部分的 不合时宜。因此InvalidateRect的默认实现 将请求转发给封闭容器对象。最后 转发链中的对象是一个Window实例。到...的时候 窗口接收请求,保证失效矩形 要妥善转变。窗口处理InvalidateRect 通知窗口系统界面并请求更新。