【设计模式】行为型模式10——责任链模式

本文介绍了责任链模式,一种用于降低耦合度并允许动态修改处理者的软件设计模式。通过示例展示了如何使用责任链来处理不同级别的购买请求,如个人、组织和公司。该模式允许请求在不同的处理者之间传递,直到找到合适的处理者。然而,它也可能带来调试困难和潜在的死循环问题。适用场景包括多个处理者根据条件处理同一请求的情况。
摘要由CSDN通过智能技术生成

责任链模式

优点

  1. 降低耦合度,无需if代码块指定处理者
  2. 可以动态修改处理者,添加,删除,调整次序等
  3. 易于拓展,符合开闭原则

缺点

  1. 调试困难
  2. 容易造成死循环
  3. 请求可能会不被处理

使用场景

  1. 有多个处理者可以处理同一个请求,但有各自的运行条件
  2. 不确定哪个处理者可以处理
/**
 * 角色(Request)
 */
public class PurchaseRequest {

    private String item;
    private int price;

    public String getItem() {
        return item;
    }

    public void setItem(String item) {
        this.item = item;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

/**
 * 角色(Handler)
 */
public abstract class Handle {

    protected Handle handle;
    protected String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Handle getHandle() {
        return handle;
    }

    public void setHandle(Handle handle) {
        this.handle = handle;
    }

    public abstract void handleRequest(PurchaseRequest purchaseRequest);
}



/**
 * 角色(ConcreteHandler)
 */
public class Person extends Handler {

    public Person() {
        this.setName("个人");
    }

    @Override
    public void handleRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() <= 100){
            System.out.println(this.getName() + "处理了此次购买请求:" + purchaseRequest.getItem() + "(" + purchaseRequest.getPrice() + "元)");
        }else{
            System.out.println(this.getName() + "无法处理,上报:" + this.getHandle().getName());
            this.getHandle().handleRequest(purchaseRequest);
        }
    }
}


/**
 * 角色(ConcreteHandler)
 */
public class Group extends Handler {

    public Group() {
        this.setName("组织");
    }

    @Override
    public void handleRequest(PurchaseRequest purchaseRequest) {
        if(purchaseRequest.getPrice() <= 500){
            System.out.println(this.getName() + "处理了此次购买请求:" + purchaseRequest.getItem() + "(" + purchaseRequest.getPrice() + "元)");
        }else{
            System.out.println(this.getName() + "无法处理,上报:" + this.getHandle().getName());
            this.getHandle().handleRequest(purchaseRequest);
        }
    }
}


/**
 * 角色(ConcreteHandler)
 */
public class Company extends Handler {

    public Company() {
        this.setName("公司");
    }

    @Override
    public void handleRequest(PurchaseRequest purchaseRequest) {
        System.out.println(this.getName() + "处理了此次购买请求:" + purchaseRequest.getItem() + "(" + purchaseRequest.getPrice() + "元)");
    }
}

测试类

public class Test {

    public static void main(String[] args) {

        PurchaseRequest purchaseRequest = new PurchaseRequest();
        purchaseRequest.setItem("idea");
        purchaseRequest.setPrice(50);

        Person person = new Person();
        Group group = new Group();
        Company company = new Company();

        person.setHandle(group);
        group.setHandle(company);

        person.handleRequest(purchaseRequest);

        System.out.println("==============================================");
        PurchaseRequest purchaseRequest2 = new PurchaseRequest();
        purchaseRequest2.setItem("idea");
        purchaseRequest2.setPrice(5000);
        person.handleRequest(purchaseRequest2);
    }
}

结果
责任链模式结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值