zoukankan      html  css  js  c++  java
  • 设计模式责任链

    责任链模式


    设计原则:遵循迪米特
    常用场景:一个请求的处理需要多个对象当中的一个或几个协作处理
    使用概率:15%
    复杂度:中
    变化点:处理链的长度与次序
    选择关键点:对于每一次请求是否每个处理的对象都需要一次处理机会
    逆鳞:无


    主要思想:
    有点类似黑盒测试,只知道现在有一个方法需要调用,但是调用到哪,谁最终完成了这个方法以及怎么完成的不知道
    所谓责任链指这里的拥有这个处理方法的类有很多,但是处理需要一定的条件,比如最简单的订单买5个面包,但现在卖面包的店很多,我们需要一个一个的去买,
    责任链模式,往往也会有一个调度者,这里比如是订单平台,平台负责看第一个家有5个没,没有下一家,再下一家,直到买到,但是平台的询问是有一定的顺序的,比如店1问完、店2、店3.....
    这就一条链式的调用



    public interface BreadStore {
    
        public boolean sell(int  sellCount);
    
        public void setNextStore(BreadStore store);
    }
    
    
    public class BreadStoreImpement1 implements BreadStore {
    
        private int breadCount;
    
        private BreadStore nextStore;
    
    
        public BreadStoreImpement1(int breadCount) {
            this.breadCount = breadCount;
        }
    
        @Override
        public boolean sell(int sellCount) {
            if (sellCount<=breadCount) {
                System.out.println("1店面包足够,售出:"+sellCount);
                return true;
            } else {
                System.out.println("1店面包不够");
                if (this.nextStore!=null) {
                    return this.nextStore.sell(sellCount);
                }
            }
            return false;
        }
    
    
        @Override
        public void setNextStore(BreadStore store) {
            this.nextStore = store;
        }
    }
    
    public class BreadStoreImpement2 implements BreadStore {
    
        private int breadCount;
    
        private BreadStore nextStore;
    
    
        public BreadStoreImpement2(int breadCount) {
            this.breadCount = breadCount;
        }
    
        @Override
        public boolean sell(int sellCount) {
            if (sellCount<=breadCount) {
                System.out.println("2店面包足够,售出:"+sellCount);
                return true;
            }else {
                System.out.println("2店面包不够");
                if (this.nextStore!=null) {
                    return this.nextStore.sell(sellCount);
                }
            }
            return false;
        }
    
        @Override
        public void setNextStore(BreadStore store) {
            this.nextStore = store;
        }
    }
    
    
    public class BreadStoreImpement3 implements BreadStore {
    
        private int breadCount;
    
        private BreadStore nextStore;
    
    
        public BreadStoreImpement3(int breadCount) {
            this.breadCount = breadCount;
        }
    
        @Override
        public boolean sell(int sellCount) {
            if (sellCount<=breadCount) {
                System.out.println("3店面包足够,售出:"+sellCount);
                return true;
            } else {
                System.out.println("3店面包不够");
                if (this.nextStore!=null) {
                    return this.nextStore.sell(sellCount);
                }
            }
            return false;
        }
    
        @Override
        public void setNextStore(BreadStore store) {
            this.nextStore = store;
        }
    }
    
    
    public class OrderManager {
    
        private BreadStore head;
    
        public void registeBreadStore(BreadStore... stores) {
            for (int i = 0; i<stores.length; i++) {
                if (this.head==null) {
                    this.head = stores[i];
                }
                if ((i+1)<stores.length) {
                    stores[i].setNextStore(stores[i+1]);
                }
            }
        }
    
        public boolean sellBread(int sellCount) {
            return head.sell(sellCount);
        }
    }
    
    
    public class Client {
        public static void main(String[] args) {
            BreadStoreImpement1 store1=new BreadStoreImpement1(1);
            BreadStoreImpement2 store2=new BreadStoreImpement2(2);
            BreadStoreImpement3 store3=new BreadStoreImpement3(3);
            OrderManager manager=new OrderManager();
            manager.registeBreadStore(store1,store2,store3);
            manager.sellBread(2);
    
            manager.sellBread(4);
        }
    }
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    网页设计中颜色的搭配
    CSS HACK:全面兼容IE6/IE7/IE8/FF的CSS HACK
    UVa 1326 Jurassic Remains
    UVa 10340 All in All
    UVa 673 Parentheses Balance
    UVa 442 Matrix Chain Multiplication
    UVa 10970 Big Chocolate
    UVa 679 Dropping Balls
    UVa 133 The Dole Queue
  • 原文地址:https://www.cnblogs.com/zhaojj/p/7798346.html
Copyright © 2011-2022 走看看