职责链模式的应用

来源:互联网 发布:全国打拐dna数据库查询 编辑:程序博客网 时间:2024/06/05 21:57

当算法牵涉到一种链型运算,而且不希望处理过程中有过多的循环和条件选择语句,并
且希望比较容易的扩充文法,可以采用职责链模式。
1、意图
使多个对象都有机会处理请求,避免请求的发送者和接收者之间的耦合关系,可以把这
些对象链成一个链,并且沿着这个链来传递请求,直到处理完为止。
当处理方式需要动态宽展的时候,职责链是一个很好的方式。
2、使用场合
以下情况可以使用职责链模式:
1)有多个对象处理请求,到底怎么处理在运行时确定。
2)希望在不明确指定接收者的情况下,向多个对象中的一个提交请求。
3)可处理一个请求的对象集合应该被动态指定。
3、结构
职责链的结构如下。
其中:
Handler 处理者
方法:HandlerRequest 处理请求
ConcreteHandler 具体处理者
关联变量:successor (后续)是组成链所必需。
4、实例
下面的实例反映了上面职责链的工作过程,注意链是在运行中建立的。
using System;
using System.Windows.Forms;
namespace 基本职责链{
public abstract class Handler{
public Handler successor;
public int s;
public abstract int HandlerRequest(int k);
}
public class ConcreteHandler1:Handler{
public override int HandlerRequest(int k){
int c=k+s;
return c;
}
}
}
调用
Handler m;
private void Form1_Load(object sender, System.EventArgs e){
//建立职责链
Handler ct=new ConcreteHandler1();
Handler ct1=null;
ct.s=0;
m=ct;
ct1=m;
for (int i=1;i<10;i++){
ct=new ConcreteHandler1();
ct.s=i;
ct1.successor=ct;
ct1=ct;
}
}
private void button1_Click(object sender, System.EventArgs e){
//显示
see(m,10);
}
void see(Handler m,int b){
if (m !=null){
int s=m.HandlerRequest(b);
listBox1.Items.Add(s);
m=m.successor;
see(m,s);
}
}
}
我们需要注意,随着技术的进步,设计模式是需要随着时代的进步而进步的。从某种意
义上讲,GoF 的“设计模式”从概念上的意义,要超过对实际开发上的指导,很多当初难以
解决的问题,现在已经可以轻而易举的解决了,模式的实现更加洗练,这就是我们设计的时
候不能死搬硬套的原因。

原创粉丝点击