Java——Java基础之设计模式篇:责任链模式

1、需求

学校OA系统的采购审批项目:需求是

采购员采购教学器材
如果金额小于等于5000,由教学主任审批
如果金额小于等于10000,由院长审批
如果金额小于等于30000,由副校长审批
如果金额超过30000以上,有校长审批

2、方案一

最容易想到的,将需求转变成if else。导致代码强耦合,需要知道不同人审批的金额界限,并且如果审批金额界限发生变化,相关代码也要改变。

if (price <= 5000) {
	教学主任审批
} else if (price <= 10000) {
	院长审批
} else if (price <= 30000) {
	副校长审批
} else {
	校长审批
}

3、方案二:责任链

责任链模式:为请求创建了一个处理者对象的链。每个处理者都包含对另一个处理者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个处理者,依此类推。

  • 客户端:创建处理链,从责任链的第一个处理者开始处理请求
  • 抽象处理者:包含下一个处理者、处理请求的方法
  • 具体处理者:实现抽象处理者的处理请求方法,判断能否处理本次请求,如果可以则处理请求,否则将该请求转给它的后继者
    在这里插入图片描述

在这里插入图片描述

代码实现:重在思路

  • 创建请求
@Data
public class MyRequest {
	private int price;
	public MyRequest(int price) {
		this.price = price;
	}
}
  • 创建抽象处理者
public abstract class Handler {
	// 必须:下一个处理者
	Handler nextHandler;
	public void setNext(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
	// 必须:处理请求的方法
	public abstract void handleRequest(MyRequest request);
	
	// 可选
	String handlerName;
	public Handler(String name) {
		this.handlerName = name;
	}
}
  • 创建具体处理者
public class 教学主任 extends Handler {
	// 必须:实现抽象处理者的处理请求方法
    @Override
    public void handleRequest(MyRequest request) {
        if(request.getPrice() <= 5000) {
            System.out.println("被"+this.name+"处理");
        } 
        //如果不满足条件,则丢给下一个处理者
        else {
        	System.out.println("不能被"+this.name+"处理");
            nextHandler.handleRequest(request);
        }
    }
    // 可选
    public 教学主任(String name) {
        super(name);
    }
}
public class 院长 extends Handler {
	// 必须:实现抽象处理者的处理请求方法
    @Override
    public void handleRequest(MyRequest request) {
    	// 判断能否处理本次请求,如果可以则处理请求
        if (request.getPrice() <= 5000) {
            System.out.println("被"+this.name+"处理");
        } 
        // 否则丢给下一个处理者
        else {
       	 	System.out.println("不能被"+this.name+"处理");
            nextHandler.handleRequest(request);
        }
    }
    // 可选
    public 院长(String name) {
        super(name);
    }
}
public class 副校长 extends Handler {}
public class 校长 extends Handler {}
  • 客户端
public class Client {
	public static void main(String[] args) {
		// 1、创建请求
		MyRequest request = new MyRequest(28000);
		// 2、创建所有需要的处理者
		教学主任 教学主任1 = new 教学主任("张教学主任");
		院长 院长2 = new 院长("王院长");
		副校长 副校长3 = new 副校长("孙副校长");
		校长 校长4 = new 校长("李校长");
		// 3、形成责任链
		教学主任1.setNext(院长2);
		院长2.setNext(副校长3);
		副校长3.setNext(校长4);
		// 4、从责任链的第一个处理者开始处理请求
		教学主任1.handleRequest(request);
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值