X.d 笔记

小Web,大世界

0%

设计模式(13):责任链模式 Chain

责任链模式,个人感觉就是一个有序的协作模式,(PS:不知道无序的协作模式可不可以算做是责任链模式)

责任链模式 Chain

在责任链模式中,很多对象由每一个对象对其下家的引用而接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

问题:

There is a potentially variable number of “handler” or “processing element” or “node” objects, and a stream of requests that must be handled. Need to efficiently process the requests without hard-wiring handler relationships and precedence, or request-to-handler mappings.

意图:

  • Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
  • Launch-and-leave requests with a single processing pipeline that contains many possible handlers.
  • An object-oriented linked list with recursive traversal.

代码

例:支付宝的代付,可以理解为责任链模式(实际编码上应该不会应用这种模式吧^_^),比如支付宝上你老婆买了件东西,10块钱找你代付, 你刚好没时间,找你的朋友A代付,A收到请求时手上没钱,找A的朋友B代付,B收到请求时刚好有欠B10块钱的C在旁边,找C代付,C付了钱,告诉B,B再告诉A付了,A再通知你付了钱,你再告诉你老婆.每个人只要关心他叫的那个被代付的人是否帮你付了就行

代码1:付款人的对象,每个人都可以是一个付款人

public interface Payer {
   public boolean pay(int money);
}

代码二:支付宝,付款时可以输入对方的帐号,叫对方代付

public class Alipay {
    private int money;

    public Alipay(int money) {
        this.money = money;
    }

    public boolean payMoneyByOther(Payer payer){
        return payer.pay(money);
    }
}

代码三:责任链

public class MemberA implements Payer{
    @Override
    public boolean pay(int money) {
        System.out.println("支付宝会员A:"+"老婆找我代付啊,现在不能上网,郁闷,找朋友B帮我老婆代付下");
        return new MemberB().pay(money);
    }
}

public class MemberB implements Payer{
    @Override
    public boolean pay(int money) {
        System.out.println("支付宝会员B:"+"兄弟要我代付"+money+"块钱好,刚好C借我的钱,让他去帮我还");
        return new MemberC().pay(money);
    }
}

public class MemberC implements Payer{
    @Override
    public boolean pay(int money) {
        System.out.println("支付宝会员C:"+"好吧,钱还清了,我又少了"+money+"块");
        return true;
    }
}

代码三:发起代付

public static void main(String[] arsgs){
     Alipay alipay = new Alipay(10);
        System.out.println("买了个小东西花了10块,没钱了,让A帮我付钱,噶噶");
        Payer a = new MemberA();
        System.out.println("--代付 start--");
        boolean result = alipay.payMoneyByOther(a);
        System.out.println("--代付 end--");
        System.out.println(result?"代付成功":"代付失败");
    }

小结

责任链模式 Chain

  • 使用频率:
    作为一个WEB开发者,这个模式只适合搭框架(比如Struts的拦截器),业务逻辑使用的场景不多,对游戏开发者开说应该是天天使用了。

  • 利弊影响:
    还行吧,只要每个任务目标明确应该还是挺清晰的。