深入Java设计模式之责任链模式

责任链模式原理

如果有多个对象都有机会处理请求,责任链可使请求的发送者和接收者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。

责任链模式优缺点

优点:  将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求  可以简化对象,因为它无须知道链的结构  可以动态地增加或删减处理请求的链结构

缺点:  请求从链的开头进行遍历,对性能有一定的损耗  并不保证请求一定被处理 

适用场合

 有多个对象可以处理一个请求  不明确接收者的情况  有序、无序链,线型、树形、环形链

 

责任链模式和状态模式主要区别

 责任链模式注重请求的传递  状态模式注重对象状态的转换

 

责任链模式示例代码

购买请求决策项目介绍

 场景:财务审批  
 1.小组领导接到的审批 小于5000小组领导审批,否则执行2
 2.部门领导接到的审批 大于5000 且小于10000部门领导审批,否则执行3
 3.副主席接到的审批     大于10000且小于50000副主席审批,否则执行4
 4.主席接到的审批         大于50000主席审批,否则执行1

考虑扩展性 思考如何设计

 

package com.lzhsite.technology.designPattern.chainms;


public class MainTest {

	public static void main(String[] args) {
		
		Client mClient = new Client();
		Approver GroupLeader = new GroupApprover("Tom");
		Approver VicePresident = new VicePresidentApprover("Kate");
		Approver DepartmentLeader = new DepartmentApprover("Jerry");
		Approver President = new PresidentApprover("Bush");
		
		GroupLeader.SetSuccessor(DepartmentLeader);
		DepartmentLeader.SetSuccessor(VicePresident);
		VicePresident.SetSuccessor(President);
		President.SetSuccessor(GroupLeader);
		
		VicePresident.ProcessRequest(mClient.sendRequst(1, 100, 40));
		VicePresident.ProcessRequest(mClient.sendRequst(2, 200, 40));
		VicePresident.ProcessRequest(mClient.sendRequst(3, 300, 40));
		VicePresident.ProcessRequest(mClient.sendRequst(4, 400, 140));
		
	}


}

 

package com.lzhsite.technology.designPattern.chainms;

public abstract class Approver {
	 Approver successor;
	 String Name;
	public Approver(String Name)
	{
		this.Name=Name;
	}
	public abstract void ProcessRequest( PurchaseRequest request);
	public void SetSuccessor(Approver successor) {
		// TODO Auto-generated method stub
		this.successor=successor;
	}
}
package com.lzhsite.technology.designPattern.chainms;
/**
 * 组内领导审批
 * @author lzhcode
 *
 */
public class GroupApprover extends Approver {

	public GroupApprover(String Name) {
		super(Name+" GroupLeader");
		// TODO Auto-generated constructor stub
		
	}

	@Override
	public void ProcessRequest(PurchaseRequest request) {
		// TODO Auto-generated method stub

		if (request.GetSum() < 5000) {
			System.out.println("**This request " + request.GetID()
					+ " will be handled by "
					+ this.Name + " **");
		} else {
			successor.ProcessRequest(request);
		}
	}

}
package com.lzhsite.technology.designPattern.chainms;
/**
 * 部门领导审批
 * @author lzhcode
 *
 */
public class DepartmentApprover extends Approver {

	public DepartmentApprover(String Name) {
		super(Name + " DepartmentLeader");

	}

	@Override
	public void ProcessRequest(PurchaseRequest request) {
		// TODO Auto-generated method stub

		if ((5000 <= request.GetSum()) && (request.GetSum() < 10000)) {
			System.out.println("**This request " + request.GetID()
					+ " will be handled by " + this.Name + " **");
		} else {
			successor.ProcessRequest(request);
		}

	}

}
package com.lzhsite.technology.designPattern.chainms;
/**
 * 副总经理审批
 * @author lzhcode
 *
 */
public class VicePresidentApprover extends Approver {

	public VicePresidentApprover(String Name) {
		super(Name + " Vice President");
	}

	@Override
	public void ProcessRequest(PurchaseRequest request) {
		// TODO Auto-generated method stub
		if ((10000 <= request.GetSum()) && (request.GetSum() < 50000)) {
			System.out.println("**This request " + request.GetID()
					+ " will be handled by " + this.Name + " **");
		} else {
			successor.ProcessRequest(request);
		}
	}

}
package com.lzhsite.technology.designPattern.chainms;
/**
 * 副总经理审批
 * @author lzhcode
 *
 */
public class VicePresidentApprover extends Approver {

	public VicePresidentApprover(String Name) {
		super(Name + " Vice President");
	}

	@Override
	public void ProcessRequest(PurchaseRequest request) {
		// TODO Auto-generated method stub
		if ((10000 <= request.GetSum()) && (request.GetSum() < 50000)) {
			System.out.println("**This request " + request.GetID()
					+ " will be handled by " + this.Name + " **");
		} else {
			successor.ProcessRequest(request);
		}
	}

}
package com.lzhsite.technology.designPattern.chainms;

public class Client {

	public Client() {

	}

	public PurchaseRequest sendRequst(int Type, int Number, float Price) {
		return new PurchaseRequest(Type, Number, Price);
	}

}
package com.lzhsite.technology.designPattern.chainms;

public class PurchaseRequest {
	private int Type = 0;
	private int Number = 0;
	private float Price = 0;
	private int ID = 0;

	public PurchaseRequest(int Type, int Number, float Price) {
		this.Type = Type;
		this.Number = Number;
		this.Price = Price;
	}

	public int GetType() {
		return Type;
	}

	public float GetSum() {
		return Number * Price;
	}

	public int GetID() {
		return (int) (Math.random() * 1000);
	}
}

 

### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据与算法架构提升之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值