设计模式之责任链模式

来源:互联网 发布:百度蜘蛛池源码 编辑:程序博客网 时间:2024/06/05 22:56

设计模式之责任链模式

处理者抽象类Handler

客户对象Customer

设计模式之责任链模式

责任链模式就是客户对象发起一个请求,根据这个请求的具体参数,从责任链中的众多对象中,选择出一个处理者对象来处理这个请求。如何选择出呢?每个处理者对象先判断自己是否可以处理,是的话,就自己处理,中断传递;否的话,就向后继传递请求,一级一级的传递下去。

处理者抽象类Handler:

public abstract class Handler {        protected Handler successor;        public void setSuccessor(Handler successor) {            this.successor = successor;        }        public abstract void handDiscount(float discount);}

底层销售员,继承Handler抽象类

public class Sale extends Handler {    @Override    public void handDiscount(float discount) {        if(discount<=0.25){            System.out.println(this.getClass()+"批准了这次折扣:"+discount);        }else{            this.successor.handDiscount(discount);        }    }}

销售经理,继承Handler抽象类

public class Manager extends Handler {    @Override    public void handDiscount(float discount) {        if(discount<=0.35){            System.out.println(this.getClass()+"批准了这次折扣:"+discount);        }else{            this.successor.handDiscount(discount);        }    }}

主管,副总裁,总裁,继承Handler抽象类(代码省略)


客户对象Customer

public class Customer {    private Handler handler;    public void setHandler(Handler handler) {        this.handler = handler;    }    public Customer(Handler handler) {        super();        this.handler = handler;    }    public void requestDiscount(float discount){        handler.handDiscount(discount);    }}

处理者工厂

public class HandlerFactory {    //工厂设计模式,创建对象    public static Handler creatHandler() {          Handler sale=new Sale();         Handler manager=new Manager();         Handler director=new Director();         Handler vicePresident=new VicePresident();         Handler ceo=new Ceo();              sale.setSuccessor(manager);        manager.setSuccessor(director);        director.setSuccessor(vicePresident);        vicePresident.setSuccessor(ceo);        return sale;    }}

测试类

public class Test {    public static void main(String[] args){             Customer customer=new Customer(HandlerFactory.creatHandler());        for(int i=0;i<10;i++){            float discount=new  Random().nextFloat();            customer.requestDiscount(discount);        }                   }}

总结

责任链核心:Handler中引入自身对象,作为后继对象,这样才能一级一级的传递下去,形成责任链。

责任链模式缺点:只有一个请求,只需一个concreteHandler去处理,却通过工厂方法创建了大量的concreteHandler对象,极大的浪费内存。自己使用时需谨慎。

责任链模式应用:java的异常处理机制,每个异常向上抛,直到顶级异常接口Throwsable;javascript中的dom,例如:td–tr–table

自己的一点点理解,如有不对,欢迎指正。来自于慕课网

这里写图片描述