Design patterns 调用抽象处理程序方法的类是否有名称/模式
设想两个类Design patterns 调用抽象处理程序方法的类是否有名称/模式,design-patterns,interface,handler,Design Patterns,Interface,Handler,设想两个类TypeAServer和TypeBServer,它们实现了某种功能,在发生某些事件时需要调用方法。除了提供离散回调函数外,当我想要实现复合行为时,我可以想到两种稍微不同的方法: 类类型服务器(ABC): 定义初始化(自): 做点什么 @抽象方法 def on_类型_a_事件(自身,事件): 当发生事件类型A时,将调用“” 定义一些消息生成方法(self): ... self.\u handler.on\u类型\u事件(e) 类类型服务器(ABC): 定义初始化(自): 做点什么 @抽象
TypeAServer
和TypeBServer
,它们实现了某种功能,在发生某些事件时需要调用方法。除了提供离散回调函数外,当我想要实现复合行为时,我可以想到两种稍微不同的方法:
类类型服务器(ABC):
定义初始化(自):
做点什么
@抽象方法
def on_类型_a_事件(自身,事件):
当发生事件类型A时,将调用“”
定义一些消息生成方法(self):
...
self.\u handler.on\u类型\u事件(e)
类类型服务器(ABC):
定义初始化(自):
做点什么
@抽象方法
def on_类型_b_事件(自身,事件):
当发生事件类型A时,将调用“”
定义一些消息生成方法(self):
...
self._handler.on_type_b_事件(e)
类复合服务器(类型服务器,类型服务器):
定义初始化(自):
TypeAServer.\uuuuu init\uuuuuuuuuuuu(自)
TypeBServer.\uuuuu init\uuuuuuuu(自)
def on_类型_a_事件(自身,事件):
#事件类型A的执行反应
def on_类型_b_事件(自身,事件):
#事件类型B的执行反应
在本例中,我只是用抽象方法继承类,以实现所需的行为
然而,当我不想直接继承TypeAServer
和TypeBServer
时,我也可以选择这样一种基于合成的方法:
类类型服务器:
类处理程序(ABC):
@抽象方法
def on_类型_a_事件(自身,事件):
当发生事件类型A时,将调用“”
定义初始化(自我,处理程序):
self.\u handler=handler
#做些别的事情
定义一些消息生成方法(self):
...
self.\u handler.on\u类型\u事件(e)
类类型服务器:
类处理程序(ABC):
@抽象方法
def on_类型_a_事件(自身,事件):
当发生事件类型A时,将调用“”
定义初始化(自我,处理程序):
self.\u handler=handler
定义一些消息生成方法(self):
...
self._handler.on_type_b_事件(e)
类CompositeServer(TypeAServer.Handler,TypeBServer.Handler):
定义初始化(自):
self.type_a_server=TypeAServer(handler=self)
self.type_b_server=TypeAServer(handler=self)
def on_类型_a_事件(自身,事件):
#事件类型A的执行反应
def on_类型_b_事件(自身,事件):
#事件类型B的执行反应
第二个示例与第一个示例非常相似,但它有一些众所周知的好处(请参见组合而非继承):
- 我可以决定何时设置服务器实例
- 我甚至可以更动态地添加
- 测试更简单
- 内部调用方法的名称冲突不太可能发生
我现在的问题是:我知道组合和接口之类的术语,但是有没有一种模式可以“注入”一个在构造上实现“处理程序接口”的对象(与通过继承隐式提供处理程序形成对比)?对
TypeAServer
(和TypeBServer
)所做的更改,有一个单独的,可以认为是一种形式:不是服务器“创建”自己的处理程序(读:使用自身作为处理程序),而是向其构造函数提供一个
然后,创建一个合成服务器
是同时进行两种合成:
(下面是未经请求的建议。)从这么多代码中不清楚为什么不使用第一点(称之为
CompositeHandler
),将服务器构造留给客户端。该客户机本身可以组成服务器和处理程序,但它不必这样做。策略模式?这是我第一次想到的。也许不适合100%