设计模式--责任链模式

设计模式--责任链模式,第1张

设计模式--责任链模式 责任链模式

责任链模式是将多个对象连接成一条链,同时这些对象都能接收客户端请求,目的是避免请求发送者与接收者耦合在一起,请求会沿着这条链传递请求,直到有对象处理它为止。


文章目录

责任链模式一、责任链模式主要解决了哪些场景?二、以公司采购举例

1.代码如下:2.运行结果 总结


一、责任链模式主要解决了哪些场景?

有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

公司采购流程审批,不同价钱的采购物品由不同的领导进行审批。

邮件审批,不同类型的邮件交给不同领导进行审批。

二、以公司采购举例 1.代码如下:

建立请求类

//请求类
public class PurchaseRequest {

	private int type = 0; //请求类型
	private float price = 0.0f; //请求金额
	private int id = 0;
	//构造器
	public PurchaseRequest(int type, float price, int id) {
		this.type = type;
		this.price = price;
		this.id = id;
	}
	public int getType() {
		return type;
	}
	public float getPrice() {
		return price;
	}
	public int getId() {
		return id;
	}
}

建立审批人抽象类

public abstract class Approver {

	Approver approver;  //处理者
	String name; // 名字

	public Approver(String name) {
		this.name = name;
	}

	//下一个处理者
	public void setApprover(Approver approver) {
		this.approver = approver;
	}

	//处理审批请求的方法,得到一个请求, 处理是子类完成,因此该方法做成抽象
	public abstract void processRequest(PurchaseRequest purchaseRequest);

依次建立主管、经理、董事长审批类

public class DirectorApprover extends Approver{
    public DirectorApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() <= 5000) {
            System.out.println("id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}

public class GeneralManagerApprover extends Approver{
    public GeneralManagerApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() > 5000 && purchaseRequest.getPrice() <= 30000) {
            System.out.println("id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}
public class ChairmanApprover extends Approver{
    public ChairmanApprover(String name) {
        super(name);
    }

    @Override
    public void processRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() > 30000) {
            System.out.println("id= " + purchaseRequest.getId() + " 被 " + this.name + " 处理");
        }else {
            approver.processRequest(purchaseRequest);
        }
    }
}

建立client测试

public class AtClient {

    public static void main(String[] args) {
        PurchaseRequest purchaseRequest = new PurchaseRequest(2, 10000, 2222);

        //创建相关的审批人
        DirectorApprover directorApprover = new DirectorApprover("李主管");
        GeneralManagerApprover generalManagerApprover = new GeneralManagerApprover("张总经理");
        ChairmanApprover chairmanApprover = new ChairmanApprover("董事长");
        directorApprover.setApprover(generalManagerApprover);
        generalManagerApprover.setApprover(chairmanApprover);
        chairmanApprover.setApprover(directorApprover);

        
        directorApprover.processRequest(purchaseRequest);
        generalManagerApprover.processRequest(purchaseRequest);
    }
}
2.运行结果

结果如下:

id= 2222 被 张总经理 处理
id= 2222 被 张总经理 处理
总结

优点:
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。

缺点:

1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5712468.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存