Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185417
  • 博文数量: 90
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2017-08-23 16:48
文章分类

全部博文(90)

文章存档

2015年(1)

2011年(21)

2010年(59)

2009年(9)

我的朋友

分类: C/C++

2010-06-18 16:03:34

当算法牵涉到一种链型运算,而且不希望处理过程中有过多的循环和条件选择语句,并
且希望比较容易的扩充文法,可以采用职责链模式。
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 的“设计模式”从概念上的意义,要超过对实际开发上的指导,很多当初难以
解决的问题,现在已经可以轻而易举的解决了,模式的实现更加洗练,这就是我们设计的时
候不能死搬硬套的原因。
 
 
阅读(2145) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~