责任链模式

一:责任链模式介绍

责任链模式(Chain of Responsibility)是Web项目中最经常用到的一个设计模式,比如有一个作业任务,先有一个对象对其负责处理,之后又交给其他的一个对象处理,一次传递下去,这是最通俗最简单的责任链模式的应用。

二:案例



假如客户买了某公司的一个产品,可是发现产品出了问题,于是打电话到部门A询问,部门A告诉他去问一下部门B,部门B再让他问一下部门C...... 以此类推,最后部门Z终于给他解决了问题。 

下面贴一下实现的代码,首先要有一系列的部门,这些部门就是责任链上的一系列类。 

第一个是部门的基类: 

1 /** 
 2 * 部门基类<br> 
 3 *  
 4 */
  
 5 public  abstract  class Department  {  
 6  
 7    protected Department successor;  
 8  
 9    /** 
10     * 处理方法,调用此方法处理请求 
11     */
  
12    public abstract void handleRequest();  
13  
14    /** 
15     * 赋值方法,调用此方法设置下家 
16     *  
17     * @param successor 
18     */
  
19    public void setSuccessor(Department successor) {  
20        this.successor = successor;  
21    }
  
22  
23    /** 
24     * 取值方法,得到下家对象 
25     *  
26     * @return 
27     */
  
28    public Department getSuccessor() {  
29        return successor;  
30    }
  
31}
  

后边的部门子类都要继承这个类,然后覆盖handleRequest方法去处理用户请求,另外,successor是指如果这个部门不能处理的话,将请求转接给的下一个部门。 

然后来看一个用户请求的抽象,部门的具体实现会用到,这里先列出来。这个类本质上不是cor的一个组成部分。
 1 /** 
 2 * 客户发出的请求类型<br> 
 3 *  
 4 */
  
 5 public  class Request  {  
 6    public enum RequestType {  
 7        /** 产品错误 */  
 8        ProductError,  
 9        /** 功能使用 */  
10        FunctionUsage,  
11        /** 其他请求 */  
12        Others  
13    }
  
14  
15    private RequestType type;  
16  
17    public Request(RequestType type) {  
18        this.type = type;  
19    }
  
20  
21    public RequestType getType() {  
22        return type;  
23    }
  
24  
25}
 

下面来看几个部门的具体实现:
/** 
 * 销售部门<br> 
 *  
 
*/
  
public  class SalesDepartment  extends Department  {  
  
    @Override  
    public void handleRequest(Request request) {  
        /* 判断请求的类型来决定哪种请求来自己处理,哪种抛给Successor */  
        if (request.getType() == Request.RequestType.FunctionUsage) {  
            System.out.println("SalesDepartment: The request is handled here.");  
        }
 else if (getSuccessor() != null{  
            getSuccessor().handleRequest(request);  
        }
 else {  
            System.out.println("The request cannot be handled");  
        }
  
    }
  
}
  
  
  
/** 
 * 开发部门<br> 
 *  
 
*/
  
public  class DevelopDepartment  extends Department  {  
  
    @Override  
    public void handleRequest(Request request) {  
        /* 判断请求的类型来决定哪种请求来自己处理,哪种抛给Successor */  
        if (request.getType() == Request.RequestType.ProductError) {  
            System.out.println("DevelopDepartment: The request is handled here.");  
        }
 else if (getSuccessor() != null{  
            getSuccessor().handleRequest(request);  
        }
 else {  
            System.out.println("The request cannot be handled");  
        }
  
    }
  
  
}
 

最后是调用它的客户端代码: 
 1 public  class Client  {  
 2  
 3    /** 
 4     * @param args 
 5     */
  
 6    public static void main(String[] args) {  
 7        Department sales = new SalesDepartment();  
 8        Department develop = new DevelopDepartment();  
 9          
10        sales.setSuccessor(develop);  
11          
12        Request funcReq = new Request(Request.RequestType.FunctionUsage);  
13        Request errorReq = new Request(Request.RequestType.ProductError);  
14        Request otherReq = new Request(Request.RequestType.Others);  
15          
16        sales.handleRequest(funcReq);  
17        sales.handleRequest(errorReq);  
18        sales.handleRequest(otherReq);  
19    }
  
20  
21}
 
这样,一个完整的责任链例子就写完了。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值