一、概念
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到一个对象处理它为止。
二、UML类图
三、基本代码实现
1、Handler
public abstract class Handler {
protected Handler successor;
public abstract void hanleRequest(int request);
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
2、ConcreteHandler1 ,ConcreteHandler2 ,ConcreteHandler3 根据request不同形成一条处理请求的链
public class ConcreteHandler1 extends Handler{
@Override
public void hanleRequest(int request) {
if(request>0&&request<10){
System.out.println("处理请求,"+request);
}else if(successor!=null){
successor.hanleRequest(request);
}
}
}
public class ConcreteHandler2 extends Handler{
@Override
public void hanleRequest(int request) {
if(request>=20 && request<=30){
System.out.println("处理请求,"+request);
}else if(successor!=null){
successor.hanleRequest(request);
}
}
}
public class ConcreteHandler3 extends Handler{
@Override
public void hanleRequest(int request) {
if(request>=10 && request<=20){
System.out.println("处理请求,"+request);
}else if(successor!=null){
successor.hanleRequest(request);
}
}
}
3、测试类
public class Main {
public static void main(String[] args) {
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
h1.setSuccessor(h2);
h2.setSuccessor(h3);
h1.hanleRequest(90);
}
}
四、总结
职责链模式最关键的在于当客户提交一个请求时,请求时沿链传递直到有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链中的结构。结果是职责链可以简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用。
在客户端定义链的结构,可以随时地增加或修改一个请求的结构。增强了给对象指派职责的灵活性。
要担心一个请求极可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理,所以事先要考虑全面。
网友评论