-
在这里讲解了后继是如何设置的。比如销售做不了折扣将折扣交给后继,此时在工厂方法中设置了销售员的后继是经理,经理就开始对折扣处理,经理做不了,设置后继为Director,让Director处理…… PriceHandler.createPriceHandler(); PriceHandler sales=new Sales(); sales.setSuccessor(manager); ... ...查看全部
-
责任链结构上的关键在handler持有对自己的引用 抽象接口handler中有两个方法,一个是持有对自身的引用,一个是处理折扣的抽象方法,具体的实现放在了销售人员、经理CEO等对折扣的处理,如果接收的折扣能够处理则批准,不能处理则把具体折扣交给后继successor调用processDiscount()方法来处理。疑问,这个后继是谁??查看全部
-
责任链模式的应用: 责任链模式在日常编码中可能不是经常用到的模式,但不管是前端还是后端工程师都可能天天接接触到责任链模式. JAVA中的异常处理机制是使用责任链模式 JavaScript的事件模式也是责任链模式 JAVAEE中的Filter经常可以在请求到达核心代码之前对它进行拦截并作出一些操作,当多个Filter存在的时候就共同构成了一个FilterChain,FilterChain不是一个存的责任链,责任链模式中只能有一个对象来处理请求,而FilterChain中可以有多个对象同时处理请求.查看全部
-
开闭原则(OO中的一个基本原则):对扩展开放,对变更关闭,即是如果有一个业务变更,希望新增一个类,而非修改原有代码来满足业务需求. 责任链模式的执行性能:当有请求到达时会从责任链头部开始遍历整条责任链,直到有一个处理器处理了请求,或者是整个链条遍历完成,在这过程中性能的损耗体现在两个方面. 第一是时间,相对于单个Handler处理请求的时间而言,整个链条的遍历过程会消耗更多的时间. 第二是内存,使用责任链模式创建了大量对象来表示处理器对象,但仅仅使用了其中的少部分,剩余的大部分处理器都仅仅作为一个过客.查看全部
-
在Sales与Manager之间加入一个Lead(销售小组)层级.它可以处理15%的折扣. 只需创建一个Lead类实现Handler接口,并在Handler工厂方法中重新构造责任链即可. Customer类依赖于PriceHander接口与PriceHandlerFactory工厂类,依然没有去依赖那些PriceHandler的实现类,因此说Customer与Handler之间是非常少的耦合. 将客户端看成一个模块,将Handler看成另外一个模块,两个模块之间的耦合是非常小的,它仅仅耦合于Handler模块对外提供的一个接口以及这个接口的工厂类. 解耦就是客户端代码和业务核心逻辑之间的关系问题,在责任链模式中,客户端代码并不知道责任链上的哪一个接收者会处理其请求,也就是说它与业务逻辑之间是松散的关联,客户端程序并不关注具体的Handler.因此可以轻易实现业务的变更.查看全部
-
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(); //客户端请求Handler customer.setPriceHandler(HandlerFactory.createPriceHandler()); customer.requestDiscount(0.15); 那么控制台显示由经理处理了请求.客户端并不知道是谁处理了请求,他只得到了一个处理的结果.避免了客户端与Handler之间的耦合.查看全部
-
例子: 1.创建Handler接口 public abstract class PriceHandler{ //直接后继 protected PriceHandler successor; public void setSuccessor(PriceHandler successor){ this.successor=successor; } //声明处理折扣的方法. public abstract void processDiscount(float discount); } 2.创建接口实现类 //销售,可以批准5%以内的折扣 public class Sales extends PriceHandler{ public void processDiscount(float discount){ if(discount<=0.05){ System.out.println("this.getClass().getName()"+批准了"+discount+"折扣"); }else{ //把请求交给后继Handler处理 successor.processDiscount(discount); } } } 其他manger(0.2)、vice president(0.3)、CEO(0.5)实现类也如此,但注意的是CEO的实现类中是最上一级了,因此没有后继,当不满足折扣需求时,则告诉客户不卖了 3.创建客户类 //客户,请求折扣 public class Customer{ //Handler接口的引用,代表请求教给哪个Handler处理 private PrivateHandler priceHandler; public void setPriceHandler(PriceHandler priceHandler){ this.priceHandler=priceHandler; } //客户请求折扣的方法 public void requestDiscount(float discount){ //调用Handler处理折扣的方法. priceHandler.processDiscount(discount); } } Customer类只关心折扣请求是否被处理了,而不关心最终是由谁处理的.查看全部
-
责任链模式实现 责任链模式是在Client与Handler之间的请求处理关系. 步骤: 1.创建一个Handler接口(使用抽象),类中存在一个Handler的引用,该引用是为了用来指向当前Handler的后继Handler,生成set方法,并创建处理客户端请求的业务抽象方法. 2.创建Handler的实现类,实现抽象方法,如果当前Handler能够处理请求,则处理,否则交给其后继Handler处理,即调用后继引用的抽象方法. 3.创建客户类,该类中存在一个Handler接口的引用,代表把请求传递给哪个Handler处理.还要创建请求Handler的业务方法. 4.创建工厂方法为Handler构成责任链,方法内部实例化所有Handler的实现类,并指定这些Handler实现类的直接后继,方法返回责任链的第一个Handler去处理客户端的请求. 5.创建测试类,创建客户端实例,并为客户端中的Handler引用进行赋值,最后调用请求方法.查看全部
-
责任链例子: 售楼处接待买房的人是一线销售者(Sales),它的上级是经理(Manager),再上一级是副总裁(Vice President),,最高一级是CEO.每个级别可以决定的最大折扣是有限制的. 假设销售者最大能批准0.05的折扣,经理最大可以批准0.2的折扣,副总裁最大可以批准0.3的折扣,CEO最大可以批准0.5的折扣,大于这个折扣的不卖.首先接待顾客的是销售者(Handler),如果客户说要打0.03折,则在销售者范围内,则可以批准,如果客户说要打0.3折,则销售者就要向上级请求,直到有一级有权力批准满足的Handler. 在JAVA中,意义上的接口可以使用interface或abstract class查看全部
-
责任链模式: 将接收者对象连成一条链,并在该链上传递请求,直到有一个接收者对象处理它,通过让更多对象有机会处理请求,避免了请求的发送者和接收者之间的偶尔. 图中客户端像Handler接口发送一个请求,而Handler接口中存在着自己接口类型的引用,并且指向后继,循环形成一条HandlerChain.请求只在某一个Handler上进行处理.查看全部
-
在js中的应用,冒泡和捕获查看全部
-
责任链在java中的应用-异常处理查看全部
-
什么是责任链模式查看全部
-
Handler Chain:每个人都是个handler,通过收尾相接,将花球向下传递。 花球代表Request 击鼓人代表Client COR包装的对象,依赖于抽象,而非依赖于具体。轻而易举实现业务变更,低耦合,当增加新的对象,不影响原有代码。 1、基于开闭原则 新增一个类,而非修改原有代码。 2、执行性能 性能损耗在两个方面:时间和内存。无用处理器太多,耗费内存。查看全部
-
client调用抽象handler类或接口,该handler有指向自己的一个对象,且包含多个具体类。 在该抽象类中还包含了责任链中调用的先后关系。当具体类发现自己并不适合该请求时,将请求转发给责任链中的后者查看全部
举报
0/150
提交
取消