JAVA设计模式之:责任链模式
2015-12-24 12:21
921 查看
责任链模式:多个对象由其对象对应下家的引用连成一条链,请求在这个链上传递,直到链上的某一个接收对象处理此请求。因为请求的客户端并不知道链上最终是谁来处理这个请求,使得系统可以在不影响客户端的情况下动态地重新组织和分配责任,从而避免了请求发送者与请求处理者之间的耦合。
责任链械中涉及到三种角色:
1,抽象处理者角色
2,具体处理者角色
3,请求发送者
小例子:假设去买房子,买房子就需要砍价, 卖房的人职位不同,可以优惠的价格也不同,不同职位就可以形成一个处理请求的链。我们暂定: *
基层销售员,只能优惠3% * 销售经理:可以优惠5% *
销售总监:可以优惠8% * 老板(Boss):优惠10%
直接上代码:
/**
* 抽象处理者(Handler)角色:处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。
* 这个角色通常由一个Java抽象类或者Java接口实现。抽象方法handlePriceRequest()规范了子类处理请求的操作。
* @date 2015-12-24 上午11:26:56
*/
public abstract class RoomRateHandler {
protected RoomRateHandler mHandler;
//直接由子类继承,用于传递请求
public void setPriceHandler(RoomRateHandler mHandler){
this.mHandler=mHandler;
}
//处理具体问题:处理价格请求
public abstract void handlePriceRequest(float discount);
/**
* 设置请求处理链的层次关系 ,获取处理请求的对象
* @description:
* @date 2015-12-24 上午11:51:54
*/
public static RoomRateHandler cretateHandler(){
RoomRateHandler salesMan=new SalesMan();
RoomRateHandler salesManager=new SalesManager();
RoomRateHandler saleDirector=new SalesDirector();
RoomRateHandler topManager=new TopManager();
salesMan.setPriceHandler(salesManager);
salesManager.setPriceHandler(saleDirector);
saleDirector.setPriceHandler(topManager);
return salesMan;
}
}
---------------具体处理者(SalesMan)角色---------------------------------
/**
* 具体处理者(SalesMan)角色:具体处理者(SalesDirector)角色:具体处理者收到请求后,可以选择处理请求,也可以将请求传给下家(上级)。
* 具体处理者都持有对链上下家(上级)对象的引用,因此具体处理者把请求传递下去。
* @description:
* @date 2015-12-24 上午11:29:16
*/
public class SalesMan extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if(discount<=0.03){
System.out.format("%s批准了:%.3f%n","业务员",discount);
}else{
mHandler.handlePriceRequest(discount);
}
}
}
-------------------具体处理者(SalesManager)角色------------------------------
public class SalesManager extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if(discount<=0.08){
System.out.format("%s批准了:%.3f%n","销售经理",discount);
}else{
mHandler.handlePriceRequest(discount);
}
}
}
-------------------具体处理者(SalesDirector )角色------------------------------
public class SalesDirector extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if(discount<=0.05){
System.out.format("%s批准了:%.3f%n","销售总监",discount);
}else{
mHandler.handlePriceRequest(discount);
}
}
}
-----------------
具体处理者(TopManager)角色--------------------------------
/**
* 具体处理者(TopManager)角色:因为当前 角色已经处于链尾,所以是最终处理了。
* @description:
* @author ldm
* @date 2015-12-24 上午11:29:16
*/
public class TopManager extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if (discount <= 0.1) {
System.out.format("%s批准了:%.3f%n", "老板", discount);
}
else {
System.out.format("%s不同意:%.3f%n", "老板", discount);
}
}
}
-------------------请求发送者---------------------------
/**
* 发出请求的客户(模拟买房子的人)
* @description:
* @author ldm
* @date 2015-12-24 上午11:35:54
*/
public class Customer {
private RoomRateHandler mHandler;
public void setPriceHandler(RoomRateHandler mHandler) {
this.mHandler = mHandler;
}
public void requestDiscount(float discount) {
mHandler.handlePriceRequest(discount);
}
public static void main(String[] args) {
Customer customer = new Customer();
customer.setPriceHandler(RoomRateHandler.cretateHandler());//获取处理对象,站你面前的可能是老板,也可能是业务员...
Random random = new Random();
for (int i = 0; i < 8; i++) {// 随机构造8个买房子的人
System.out.println(i + "---");
customer.requestDiscount(random.nextFloat()/10);//处理价格(谈判)
}
}
}
----------处理结果-------------------------
如果要增加层级怎么办呢?很简单,比如增加销售主管SalesSupervisor,我们只需要新建一个类SalesSupervisor
extends RoomRateHandler,实现处理方法handlePriceRequest(float discount);同时不要忘记在RoomRateHandler类中cretateHandler()中设置好对应的层级链就可以啦。
责任链械中涉及到三种角色:
1,抽象处理者角色
2,具体处理者角色
3,请求发送者
小例子:假设去买房子,买房子就需要砍价, 卖房的人职位不同,可以优惠的价格也不同,不同职位就可以形成一个处理请求的链。我们暂定: *
基层销售员,只能优惠3% * 销售经理:可以优惠5% *
销售总监:可以优惠8% * 老板(Boss):优惠10%
直接上代码:
/**
* 抽象处理者(Handler)角色:处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。
* 这个角色通常由一个Java抽象类或者Java接口实现。抽象方法handlePriceRequest()规范了子类处理请求的操作。
* @date 2015-12-24 上午11:26:56
*/
public abstract class RoomRateHandler {
protected RoomRateHandler mHandler;
//直接由子类继承,用于传递请求
public void setPriceHandler(RoomRateHandler mHandler){
this.mHandler=mHandler;
}
//处理具体问题:处理价格请求
public abstract void handlePriceRequest(float discount);
/**
* 设置请求处理链的层次关系 ,获取处理请求的对象
* @description:
* @date 2015-12-24 上午11:51:54
*/
public static RoomRateHandler cretateHandler(){
RoomRateHandler salesMan=new SalesMan();
RoomRateHandler salesManager=new SalesManager();
RoomRateHandler saleDirector=new SalesDirector();
RoomRateHandler topManager=new TopManager();
salesMan.setPriceHandler(salesManager);
salesManager.setPriceHandler(saleDirector);
saleDirector.setPriceHandler(topManager);
return salesMan;
}
}
---------------具体处理者(SalesMan)角色---------------------------------
/**
* 具体处理者(SalesMan)角色:具体处理者(SalesDirector)角色:具体处理者收到请求后,可以选择处理请求,也可以将请求传给下家(上级)。
* 具体处理者都持有对链上下家(上级)对象的引用,因此具体处理者把请求传递下去。
* @description:
* @date 2015-12-24 上午11:29:16
*/
public class SalesMan extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if(discount<=0.03){
System.out.format("%s批准了:%.3f%n","业务员",discount);
}else{
mHandler.handlePriceRequest(discount);
}
}
}
-------------------具体处理者(SalesManager)角色------------------------------
public class SalesManager extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if(discount<=0.08){
System.out.format("%s批准了:%.3f%n","销售经理",discount);
}else{
mHandler.handlePriceRequest(discount);
}
}
}
-------------------具体处理者(SalesDirector )角色------------------------------
public class SalesDirector extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if(discount<=0.05){
System.out.format("%s批准了:%.3f%n","销售总监",discount);
}else{
mHandler.handlePriceRequest(discount);
}
}
}
-----------------
具体处理者(TopManager)角色--------------------------------
/**
* 具体处理者(TopManager)角色:因为当前 角色已经处于链尾,所以是最终处理了。
* @description:
* @author ldm
* @date 2015-12-24 上午11:29:16
*/
public class TopManager extends RoomRateHandler {
@Override
public void handlePriceRequest(float discount) {
if (discount <= 0.1) {
System.out.format("%s批准了:%.3f%n", "老板", discount);
}
else {
System.out.format("%s不同意:%.3f%n", "老板", discount);
}
}
}
-------------------请求发送者---------------------------
/**
* 发出请求的客户(模拟买房子的人)
* @description:
* @author ldm
* @date 2015-12-24 上午11:35:54
*/
public class Customer {
private RoomRateHandler mHandler;
public void setPriceHandler(RoomRateHandler mHandler) {
this.mHandler = mHandler;
}
public void requestDiscount(float discount) {
mHandler.handlePriceRequest(discount);
}
public static void main(String[] args) {
Customer customer = new Customer();
customer.setPriceHandler(RoomRateHandler.cretateHandler());//获取处理对象,站你面前的可能是老板,也可能是业务员...
Random random = new Random();
for (int i = 0; i < 8; i++) {// 随机构造8个买房子的人
System.out.println(i + "---");
customer.requestDiscount(random.nextFloat()/10);//处理价格(谈判)
}
}
}
----------处理结果-------------------------
如果要增加层级怎么办呢?很简单,比如增加销售主管SalesSupervisor,我们只需要新建一个类SalesSupervisor
extends RoomRateHandler,实现处理方法handlePriceRequest(float discount);同时不要忘记在RoomRateHandler类中cretateHandler()中设置好对应的层级链就可以啦。
相关文章推荐
- java 深入技术七(类的结构和反射)
- java常用正则表达式
- 阶梯问题
- Eclipse快捷键 10个最有用的快捷键
- Spring的事务传播属性
- 关闭eclipse自动弹出console功能
- Java中i++与++i的区别(效率分析)
- java中怎么使用json字符串
- Java中常见的日期操作(取值、转换、加减、比较)
- java数字转换为字符串,长度不够前面补0
- 【java基础】java通过相对路径读取文件
- Java integer to byte array
- 从头认识java-14.3 多维数组
- Java POI读取Excel 2003/2007/2010例子
- Convert short to byte[] in Java
- java 写入文件没有到磁盘问题
- Spring 学习笔记 (II) 之后处理器和Resource
- [分享]Java中Byte与基础类型之间的转换
- java中使用POI导入excel数据的过程中,遇到读取以科学计数法显示的数据
- java之反射技术应用(二)