Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 调用抽象处理程序方法的类是否有名称/模式_Design Patterns_Interface_Handler - Fatal编程技术网

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%