JiveJdon Community Forums
在线369人   首页   主题表   培训咨询   标签   精华   查搜   注册    登陆 RSS
首页 » 论坛 » 设计模式、框架和架构
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表
???en_US.forumThreadNext.name??? 下一主题
Go 总共有 3 回复 / 1
 发表新帖子   回复该主题贴
tbase

悄悄话
发表文章: 24
注册时间: 2004年03月02日 22:09
责任链模式探讨 2004年03月03日 13:12 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
标签列表 cor模式(9)     
责任链模式定义:
阎宏的定义:"发出这个请求的客户端并不知道链上的那一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任."

阎宏的定义很精炼,但是太精炼的以至于很多人很难理解。
定义分解如下:
1 服务端有一组策略(也可以称之为方法,算法等等)按顺序处理请求。这组策略的组织顺序与客户端无关。
2 当这组策略中的某一个策略满足结束条件时,整个责任链结束。

解释:责任链模式可以被认为是“策略对象顺序执行”。在一个顺序策略链表中的策略按顺序被调用。当某种策略满足要求,就返回成功标志或者责任链结束。


注意的是Gof的例子没有使用链表。


这个例子非常好的揭示了责任链模式的奥秘:


//: chainofresponsibility:FindMinima.javaimport junit.framework.*;class Arrays2 {
public static String toString(double[] a) {
StringBuffer result = new StringBuffer(
"[");
for(int i = 0; i < a.length; i++) {
result.append(a[i]);
if(i < a.length - 1)
result.append(
", ");
}
result.append(
"]");
return result.toString();
}
}

// Carries the result data and
// whether the strategy was successful:
class LineData {
public double[] data;
public LineData(double[] data) { this.data = data; }
private boolean succeeded;
public boolean isSuccessful() { return succeeded; }
public void setSuccessful(boolean b) { succeeded = b; }
}

interface Strategy {
LineData strategy(LineData m);
}

class LeastSquares implements Strategy {
public LineData strategy(LineData m) {
System.out.println(
"Trying LeastSquares algorithm");
LineData ld = (LineData)m;
// [ Actual test/calculation here ]
LineData r = new LineData(
new double[] { 1.1, 2.2 });
// Dummy data
r.setSuccessful(false);
return r;
}
}

class NewtonsMethod implements Strategy {
public LineData strategy(LineData m) {
System.out.println(
"Trying NewtonsMethod algorithm");
LineData ld = (LineData)m;
// [ Actual test/calculation here ]
LineData r = new LineData(
new double[] { 3.3, 4.4 });
// Dummy data
r.setSuccessful(false);
return r;
}
}

class Bisection implements Strategy {
public LineData strategy(LineData m) {
System.out.println(
"Trying Bisection algorithm");
LineData ld = (LineData)m;
// [ Actual test/calculation here ]
LineData r = new LineData(
new double[] { 5.5, 6.6 });
// Dummy data
r.setSuccessful(true);
return r;
}
}

class ConjugateGradient implements Strategy {
public LineData strategy(LineData m) {
System.out.println(
"Trying ConjugateGradient algorithm");
LineData ld = (LineData)m;
// [ Actual test/calculation here ]
LineData r = new LineData(
new double[] { 5.5, 6.6 });
// Dummy data
r.setSuccessful(true);
return r;
}
}

class MinimaFinder {
private static Strategy[] solutions = {
new LeastSquares(),
new NewtonsMethod(),
new Bisection(),
new ConjugateGradient(),
};
public static LineData solve(LineData line) {
LineData r = line;
for(int i = 0; i < solutions.length; i++) {
r = solutions[i].strategy(r);
if(r.isSuccessful())
return r;
}
throw new RuntimeException(
"unsolved: " + line);
}
}

public class FindMinima extends TestCase {
LineData line = new LineData(new double[]{
1.0, 2.0, 1.0, 2.0, -1.0, 3.0, 4.0, 5.0, 4.0
});
public void test() {
System.out.println(Arrays2.toString(
((LineData)MinimaFinder.solve(line)).data));
}
public static void main(String args[]) {
junit.textui.TestRunner.run(FindMinima.class);
}
}
///:~

tbase

悄悄话
发表文章: 24
注册时间: 2004年03月02日 22:09
Re: 责任链模式探讨 2004年03月03日 13:14 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
import junit.framework.*;
banq

悄悄话
发表文章: 9484
注册时间: 2002年08月03日 17:08
Re: 责任链模式探讨 2004年03月05日 21:07 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
很好,责任链在实际应用中通常以一种架构形式出现,比较复杂,不象纯粹例子这样简单,责任链是设计模式中比较容易理解的模式。

但是千万注意,别因为容易理解,就经常想着用它,其实根据我经验,它使用的概率很低。
tbase

悄悄话
发表文章: 24
注册时间: 2004年03月02日 22:09
Re: 责任链模式探讨 2004年03月12日 11:49 到本帖网址 加入本帖到收藏夹 发送到手机 回复该主题
多谢,多谢,正在学习中。欢迎大家指教。
进步来源于努力。
这个主题有 3 回复 / 1Go
???en_US.forumThreadPrev.name??? 上一主题
  Go back to the topic 返回本主题   Go back to the topic listing返回主题列表    返回页首返回页首
???en_US.forumThreadNext.name??? 下一主题
热点TAG: AOP cache 缓存 DDD EJB 集群 设计模式 Hibernate IOC JiveJdon OO RBAC Seam Spring Struts
正在读取,请等待...
google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘 博采网摘
查询本论坛内 回复超过的热门帖子
     回复该主题贴
标题
 
粗体 斜体 下划线 插入图片 插入代码 插入url链接 插入附件
内容
  发贴前查询 标签列表勿重复发表问题

RSS 手机阅读 add to google add to yahoo
解惑之道在J道 ,打造中国最具影响力的的企业软件社区
OpenSource JIVEJDON v3.0 Powered by JdonFramework Code © 2002-08 jdon.com
anti spam