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)。[]的