设计模式之责任链模式

来源:互联网 发布:mac fontawesome 字体 编辑:程序博客网 时间:2024/06/07 04:53

1、什么是责任链模式,生活中常见的责任链模式场景
2、责任链模式的实现
3、责任链模式如何实现解耦
4、实际案例

责任链模式:
将接收者对象练成一条链,并在该链上传递请求,直到有一个接收者对象处理它,通过让更多对象有机会处理请求,避免了请求发送者和接收者之间的耦合。

/*
* 价格处理人,负责处理客户折扣申请
*/

public abstract class PriceHandler {    /*     * 直接后继,用于传递请求     */    protected PriceHandler successor;    public void setSuccessor(PriceHandler successor) {        this.successor = successor;    }    /*     * 处理折扣申请     */    public abstract void processDiscount(float discount);       }/* * 销售,可以批准5%以内的折扣 */public class Sales extends PriceHandler {    @Override    public void processDiscount(float discount) {        if(discount <= 0.05){            System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);        }else{            successor.processDiscount(discount);        }    }

流程是顾客申请折扣,触发priceHandler对请求价格的处理,在处理价格之前通过工厂方法创建了一个priceHandler的实例,如果实例处理不了折扣,触发后继,然后调用工厂设置后继并创建新的PriceHandler来处理折扣,还是处理不了继续申请直到成功。

工厂方法的实质不在于传入参数而在于他的返回结果。
当我们设计一个接口时应该只将与这个接口相关的方法放在我们的接口之中这样才能使我们的设计更加健壮而不至于当变化发生时我们手足无措。

4.创建工厂方法为Handler构成责任链.

//工厂方法

public class HandlerFactory{    //创建构造责任链方法,返回一个Handler给客户端使用.    public static PriceHandler createPriceHandler(){    //创建所有Handler的实现类实例    PriceHandler sales=new Sales();    PriceHandler manger=new Manager();    PriceHandler vp=new VicePresident();    PriceHandler ceo=new CEO();    //使用Handler接口的setPriceHandler()方法进行责任链的构造,指定这些Handler的直接后继.    sales.setSuccessor(manger);    manger.setSuccessor(vp);    vp.setSuccessor(ceo);    //最后返回一个Handler去处理客户端的请求,此处返回一个销售者(责任链的第一个Handler).    return sales;    }}

5.创建测试类测试

Customer customer = new Customer();//客户端请求Handlercustomer.setPriceHandler(HandlerFactory.createPriceHandler());customer.requestDiscount(0.15);

那么控制台显示由经理处理了请求.客户端并不知道是谁处理了请求,他只得到了一个处理的结果.避免了客户端与Handler之间的耦合.

COR应用实例:
后端:Java中的异常处理;
前端:JavaScript Event Model;
Java Web:FilterChain in Web(不纯的COR)

责任链模式的应用
java中的exception的抛出,一层一层的往外抛。
JavaEE里面的处理请求的filter其实也类似于责任链模式,但是并不是只有一个filter能对request进行处理,算是一个非纯COR

总结:
在责任链模式中,作为请求接受者的多个对象通过其后继的引用而连接起来形成的一条链。请求在这条链上传递,直到链上某一个接受者处理这个请求,每一个接受者都可以选择自行处理请求还是向后继传递请求

在这人链模式之中发出请求的客户端并不知道链上的哪一个接受者会处理请求,从而实现了
客户端和接受者之间的解耦。

参考视频:http://www.imooc.com/learn/257

原创粉丝点击