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_Composite_Chain Of Responsibility - Fatal编程技术网

Design patterns 复合材料+;责任链示例

Design patterns 复合材料+;责任链示例,design-patterns,composite,chain-of-responsibility,Design Patterns,Composite,Chain Of Responsibility,有谁能给出一个将设计模式组合和责任链结合使用的实际例子吗 谢谢一个切实可行的答案可能是不可能的,但我可以看出你的责任链是如何组成的。下面是一个pythonish示例: >>> class DevelopmentPerformanceMonitor(): ... def getPerformanceMonitorHandlers(): ... return [] ... >>> class ProductionPerformanceMonitor(

有谁能给出一个将设计模式组合和责任链结合使用的实际例子吗


谢谢

一个切实可行的答案可能是不可能的,但我可以看出你的责任链是如何组成的。下面是一个pythonish示例:

>>> class DevelopmentPerformanceMonitor():
...   def getPerformanceMonitorHandlers():
...     return []
... 
>>> class ProductionPerformanceMonitor():
...   def getPerformanceMonitorHandlers():
...     return [check_cpu_under_load, check_available_hd]
... 
>>> class DevelopmentExceptionMonitor():
...   def getExceptionHandlers():
...     return [email_local_root, log_exception]
... 
>>> class ProductionExceptionMonitor():
...   def getExceptionHandlers():
...     return [emails_system_admin, log_exception, create_ticket]
... 
>>> class SomeSystem:
...    pm = None # Performance Monitor
...    em = None # Exception Monitor
...    def __init__(self, performance_monitor, exception_monitor):
...      pm = performance_monitor
...      em = exception_monitor
...    def on_exception(e):
...      for handler in em.getExceptionHandlers():
...        handler(e)
...    def perform_performance_monitoring(s):
...      for handler in pm.getPerformanceMonitorHandlers():
...        handler(s)

因此SomeSystem对象是性能监视器和异常监视器的组合。每个组合将返回一系列处理程序,以实现所需的责任链。虽然这个例子实际上只是使一个更简单的责任链复杂化,在这个责任链中,SomeSystem可以由责任链本身启动。尽管将它们打包可能会有所帮助。

一个非常实用的例子是GUI设计,例如使用Qt框架

QObject可以是单个对象,也可以是多个对象的组合。QoObject(理想情况下)知道它们的父QoObject,因此它们也形成了一个责任链

例如: 主窗口有一个对话框(QObject)。 该对话框有一个输入行和一个布局框(所有QObject)。 布局框有2个按钮(所有QObject)

按钮事件(如单击)将通过责任链传递,直到QObject能够处理该事件

另一个方向也有效(由于复合设计)。对话框的show()将传递给子对象,因此输入行、布局框和按钮也将可见。

此示例结合了责任链、命令和组合,并利用了.NET熟悉的
Try*
方法样式

给定的命令和处理程序类型:

公共接口IResults{}
公共接口ICommand{}
公共接口IHandler
{
布尔TryHandle(ICommand命令,输出IResults结果);
}
给出了一些
IHandler
实现:

公共类FooHandler:IHandler
{
公共布尔TryHandle(ICommand命令,输出IResults结果)
{
// ...
}
}
公共类BarHandler:IHandler
{
公共布尔TryHandle(ICommand命令,输出IResults结果)
{
// ...
}
}
和一个组合的
IHandler
实现:

公共类复合句柄:IHandler
{
公共IList处理程序{get;}=new List();
公共布尔TryHandle(ICommand命令,输出IResults结果)
{
foreach(此.Handlers中的变量处理程序){
if(handler.TryHandle(命令,输出结果)){
返回true;
}
}
结果=空;
返回false;
}
}
并在客户端代码中使用它:

var命令=/*…*/;
var handler=new CompositeHandler();
handler.Handlers.Add(newfoodhandler());
handler.Handlers.Add(newbarhandler());
i结果和结果;
if(handler.TryHandle(命令,输出结果)){
//处理
}
否则{
//未处理
}
通过使用泛型,类型参数化/约束也可以确保一定程度的安全性:

公共接口IResults{}
公共接口ICommand
where TResults:IResults
{
// ...
}
公共接口IHandler
其中TCommand:ICommand
where TResults:IResults
{
// ...
}

我在Steven Metsker和William Wake的《Java设计模式》一书中找到了复合+责任链的一个很好的例子。你可以在谷歌图书上阅读。基本上,我们有机器、生产线、机架和工厂。工厂是海湾的组成部分,等等。在这一点上,我们得到了复合模式。从机器到工厂,每个部件都有一名工程师负责部件。但是,在某些情况下,一台简单的机器没有工程师,所以我们必须寻找它的父母来找到他(CoR)。[]的