我正在研究经典的Chain Of Responsibility GoF设计模式。
我认为我能够“按原样”和预期理解经典模式,即作为一系列请求处理程序,其中只有一个将实际处理请求。
我想到,几乎可以在所有处理程序一起工作并协作以满足请求的上下文中使用相同的模式,就像在“管道”中一样。
用例是每个步骤执行全局任务的不同部分,并且可能一个步骤依赖于前一个步骤的结果,即取决于“到目前为止”完成的全部工作。
这在范围上有些相似,但与方法链的形状不同。
为了更好地说明,我举了一个例子。
让我们假设构建一个 html 标签。
涉及三个步骤(在我的简化案例中):
图像来源的定义
替代文本的定义
风格定义
我觉得可以使用相同的责任链结构来实现管道。
这是一个工作原型,如果这个想法:
from __future__ import annotations
from abc import ABC, abstractmethod
from typing import Optional
class HtmlImageTag:
def __init__(self) -> None:
self.src = None
self.alt = None
self.style = None
def render(self) -> str:
return f"<img src=\"{self.src}\" style=\"{self.style}\", alt=\"{self.alt}\" />"
class HtmlImageTagBuildingStep(ABC):
def __init__(self) -> None:
super().__init__()
self.next = None
def set_next(self, next: Optional[HtmlImageTagBuildingStep]):
self.next = next
@abstractmethod
def perform(self, image: HtmlImageTag) -> HtmlImageTag:
...
class SourceStep(HtmlImageTagBuildingStep):
def perform(self, image: HtmlImageTag) -> HtmlImageTag:
image.src = "images/my-image.jpg"
return self.next.perform(image)
class AltStep(HtmlImageTagBuildingStep):
def perform(self, image: HtmlImageTag) -> HtmlImageTag:
image.alt = "This is an image"
return self.next.perform(image)
class StyleStep(HtmlImageTagBuildingStep):
def perform(self, image: HtmlImageTag) -> HtmlImageTag:
image.style = "width: 300px; height:200px"
return self.next.perform(image)
class FinalStep(HtmlImageTagBuildingStep):
def perform(self, image: HtmlImageTag) -> HtmlImageTag:
return image
def build_image_tag() -> HtmlImageTag:
source = SourceStep()
alt = AltStep()
style = StyleStep()
final = FinalStep()
source.set_next(alt)
alt.set_next(style)
style.set_next(final)
return source.perform(HtmlImageTag())
if __name__ == "__main__":
image_tag: HtmlImageTag = build_image_tag()
print(image_tag.render())
# Result:
# <img src="images/my-image.jpg" style="width: 300px; height:200px", alt="This is an image" />
我的问题 - 希望通过上面的示例得到澄清 - 如下:
在最初的《四种设计模式》中,重点强调了模式的“意图”。因此,在不同上下文中出于不同原因应用的完全相同的语法可以被视为不同的模式。从这个角度来看,责任链绝对不是管道。如果您认为设计模式主要是一种沟通工具,即程序员之间共享的词汇,那么这种观点很有用。在这种情况下,传达模式的意图与语法一样重要。但是,您也可以提出论点,即意图纯粹是学术性的,不会改变模式的结构或功能或固有性质。 在此示例中,请考虑“管道和过滤器”是否是合适的描述。