责任链模式的实现和理解
来源:互联网 发布:知乐小说最好看 编辑:程序博客网 时间:2024/05/16 07:20
为了更好的理解mybatis中拦截器的实现,先来理解一下责任链模式的实现。
1.首先定义一个抽象类作为父类,这个父类中有一个属性,属性的类型是改父类,其职责为指定在整个责任链中当前对象的下家即后继。
package com.pattern.cor.handler;/* * 价格处理人,负责处理客户折扣申请 */public abstract class PriceHandler {/* * 直接后继,用于传递请求 */protected PriceHandler successor;public void setSuccessor(PriceHandler successor) {this.successor = successor;}/* * 处理折扣申请 */public abstract void processDiscount(float discount);}
2.定义子类,这些不同的子类就是责任链上的各个对象。
package com.pattern.cor.handler;/* * 销售, 可以批准5%以内的折扣 */public class Sales extends PriceHandler {@Overridepublic void processDiscount(float discount) {if(discount <= 0.05){System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);}else{successor.processDiscount(discount);}}}
package com.pattern.cor.handler;/* * 销售小组长, 可以批准15%以内的折扣 */public class Lead extends PriceHandler {@Overridepublic void processDiscount(float discount) {if(discount<=0.15){System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);}else{successor.processDiscount(discount);}}}
package com.pattern.cor.handler;/* * 销售经理, 可以批准30%以内的折扣 */public class Manager extends PriceHandler {@Overridepublic void processDiscount(float discount) {if(discount<=0.3){System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);}else{successor.processDiscount(discount);}}}
3.定义一个工厂,负责建立责任链,并指定责任链工作的起始对象。
package com.pattern.cor.handler;public class PriceHandlerFactory {/* * 创建PriceHandler的工厂方法 */public static PriceHandler createPriceHandler() {PriceHandler sales = new Sales();PriceHandler lead = new Lead();PriceHandler man = new Manager();sales.setSuccessor(lead);lead.setSuccessor(man);return sales;}}
3.客户端调用。
package com.pattern.cor;import java.util.Random;import com.pattern.cor.handler.PriceHandler;import com.pattern.cor.handler.PriceHandlerFactory;/* * 客户,请求折扣 */public class Customer {private PriceHandler priceHandler;public void setPriceHandler(PriceHandler priceHandler) {this.priceHandler = priceHandler;}public void requestDiscount(float discount){priceHandler.processDiscount(discount);}public static void main(String[] args){Customer customer = new Customer();customer.setPriceHandler(PriceHandlerFactory.createPriceHandler());Random rand = new Random();for(int i=1;i<=100;i++){System.out.print(i+":");customer.requestDiscount(rand.nextFloat());}}}
下面是根据自己的理解总结的责任链模式的类图:
我认为责任链模式的关键有两点:
1.父类中定义了后继(successor),每个子类创建对象时必须指定其后继对象(找好下家),否则责任链就断了。
2.工厂类PriceHandlerFactory的createPriceHandler方法,除了要建立一条完整的责任链,还需要返回责任链的起始对象。
下一篇文章中,我们来结合mybatis理解一下责任链模式是如何应用到拦截器的实现中去的
0 0
- 责任链模式的实现和理解
- 责任链模式的理解实例
- 责任链模式的理解与实例
- mina中责任链模式的实现
- 责任链模式的c++代码实现
- 责任链模式的简单实现
- c++设计模式之(状态模式和责任链模式)的实现
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 我所理解的设计模式(C++实现)——责任链模式(Chain Of Responsibility Pattern)
- 设计模式-职责链/责任链模式(Chain of Responsibility)分析理解和在Android的应用
- 责任链模式-C++实现
- 函数对象和模版实现责任链模式
- 责任链模式和状态模式的区别
- 责任链模式之个人理解
- 设计模式---责任链模式(C++实现)
- 设计模式--责任链模式--Java实现
- 责任链设计模式的原理与实现
- NSFileManager 常用方法
- 模板类的继承
- EntityFramework心得小结
- 钩子函数
- 关于C++指向指针的指针的一点测试与理解
- 责任链模式的实现和理解
- 【ProGuard探索之路系列】之二:ProGuard配置选项
- unregister_netdevice: waiting for eth1 to become free?错误
- 三维知识
- 图像直方图均衡化
- 常用adb shell命令:getevent和sendevent
- MongoDB基本概念和常用命令
- 3.1 double 与 char* 的相互转换
- Android Studio开发基础之自定义View组件