`
wangkechao.dream
  • 浏览: 44198 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
352630cf-f670-3416-b946-55dec5cd787c
设计模式
浏览量:28980
社区版块
存档分类
最新评论

6.设计模式之责任链模式

阅读更多

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任

 

我的理解是:消息在链上不断的传递,直到遇到一个可以处理此消息的处理器,【这个处理器在链上】

或者说,消息本身带有等级,每一个处理器只能处理相应等级的消息。只有消息可以被处理的时候,不会在链上传播,否则这个消息会在链上一直传播.

 

责任链模式涉及到的角色如下所示:

●抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

●具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

 

 

Example: 测试人员针对于当前测试的系统会提一些bug,bug等级为低的时候初级程序员就可以修复

                    等级为中等的时候需要中级程序员来修复,等缓为高级的时候就需要强力大牛来解决,我们

                    通过责任链来实现这一功能

 

1. 处理器

/**
 *  处理器
 */
public abstract class Handler {
	
	private Handler nextHandler;//下一个处理者

	public Handler getNextHandler() {
		return nextHandler;
	}

	public void setNextHandler(Handler nextHandler) {
		this.nextHandler = nextHandler;
	}
	
	abstract void handleRequest(int bugLevel); //处理请求的方法

}

2. 初级程序员

public class JuniorProgrammer extends Handler{

	@Override
	void handleRequest(int bugLevel) {
			
		if(1==bugLevel){
			System.out.println("bug等级为低级,初级程序员可以完成");
		}else{
			//将bug传给中级程序员
			System.out.println("bug等级太高,初级程序员处理不了,给中级程序员");
			getNextHandler().handleRequest(bugLevel);
		}
		System.out.println("------------------------");
	}

}

3.中级程序员

public class IntermediateProgrammer extends Handler{

	@Override
	void handleRequest(int bugLevel) {
		if(2==bugLevel){
			System.out.println("bug等级中级,中级程序员可以完成");
		}else{
			//将bug传给高级程序员
			System.out.println("bug等级太高,中级程序员处理不了,给高级程序员");
			getNextHandler().handleRequest(bugLevel);
		}
		System.out.println("------------------------");
	}

}

4. 高级程序员

public class SeniorProgrammer extends Handler {

	@Override
	void handleRequest(int bugLevel) {
		if (3 == bugLevel) {
			System.out.println("bug等级高级,大牛亲自出马");
		} else {
			// 将bug传给谁
			if (null != getNextHandler()) {
				getNextHandler().handleRequest(bugLevel);
			} else {
				System.out.println("bug太严重了,大牛也处理不了");
			}
		}
	}

}

5. 测试人员

 

/**
 *   测试人员
 */
public class Testor {
	public static int giveBug(int bugLevel){//专门提bug
		return bugLevel;
	}
}

 

6.运行类

public class Main {
	
	public static void main(String[] args) {
		
		Handler junior = new JuniorProgrammer();
		Handler intermediate = new IntermediateProgrammer();
		Handler senior = new SeniorProgrammer();
		
		junior.setNextHandler(intermediate);
		intermediate.setNextHandler(senior);
		
		//测试人员提bug,苦逼程序员开始改bug喽
		junior.handleRequest(Testor.giveBug(1));
		junior.handleRequest(Testor.giveBug(2));
		junior.handleRequest(Testor.giveBug(3));
		junior.handleRequest(Testor.giveBug(4));
	}

}

 

结果:

       

bug等级为低级,初级程序员可以完成
------------------------
bug等级太高,初级程序员处理不了,给中级程序员
bug等级中级,中级程序员可以完成
------------------------
------------------------
bug等级太高,初级程序员处理不了,给中级程序员
bug等级太高,中级程序员处理不了,给高级程序员
bug等级高级,大牛亲自出马
------------------------
------------------------
bug等级太高,初级程序员处理不了,给中级程序员
bug等级太高,中级程序员处理不了,给高级程序员
bug太严重了,大牛也处理不了
------------------------
------------------------
 

补:

纯的与不纯的责任链模式

一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,而是把责任推给下家。不允许出现某一个具体处理者对象在承担了一部分责任后又 把责任向下传的情况。

 

在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接收;在一个不纯的责任链模式里面,一个请求可以最终不被任何接收端对象所接收。

 

纯的责任链模式的实际例子很难找到,一般看到的例子均是不纯的责任链模式的实现。有些人认为不纯的责任链根本不是责任链模式,这也许是有道理的。但是在实际的系统里,纯的责任链很难找到。如果坚持责任链不纯便不是责任链模式,那么责任链模式便不会有太大意义了。

 

现在想想,责任链模式,比较像数据结构中的链表


 本人也是初学,HY批评指正,共同进步!

 

文档源文档 <http://blog.csdn.net/m13666368773/article/details/7702368> ,此处致谢

返回导航

 

 

 

  • 大小: 27.5 KB
分享到:
评论
2 楼 huanglei7211 2013-07-12  
小小年纪,有如此认知,必成大器!
1 楼 tiantianhappy 2013-07-12  
不错不错,楼主写的不错,例子不错哦

相关推荐

Global site tag (gtag.js) - Google Analytics