设计模式-职责链模式

职责链模式通过解耦请求发送者和接收者,使系统具有可扩展性和灵活性。它允许动态组织处理者链,每个对象有机会处理请求。然而,它也存在可能无法处理请求和可能导致性能问题的缺点。示例展示了如何使用职责链模式组织处理者来处理不同条件的请求。
摘要由CSDN通过智能技术生成

职责链模式是一种行为设计模式,其目的是将请求的发送者和接收者解耦,并且允许多个对象有机会处理请求。在职责链模式中,每个对象都有处理请求的机会,如果当前对象无法处理请求,它会将请求传递给下一个对象,直到找到能够处理请求的对象为止。

 

职责链模式包含以下几个核心角色:

  1. 抽象处理者(Handler):定义了处理请求的接口,通常包含一个抽象处理方法(例如`handleRequest()`)和一个可选的后继处理者属性。所有具体处理者类都继承自该抽象类或者实现该接口。
  2. 具体处理者(ConcreteHandler):具体处理者继承自抽象处理者,并实现了处理请求的方法。如果可以处理请求,它将执行相应的操作;否则,它将将请求传递给下一个处理者。
  3. 客户端(Client):客户端创建具体处理者链,并将请求发送给第一个处理者。客户端需要知道如何组织处理者链和发送请求的方式。

 

优点

  1. 解耦发送者和接收者:职责链模式将请求的发送者和接收者解耦。发送者不需要知道请求的具体处理者是谁,只需要将请求发送给第一个处理者即可,由处理者链负责逐个处理请求。
  2. 可扩展性和灵活性:由于职责链模式的处理者链是动态组织的,可以方便地添加、移除或修改处理者,从而灵活地调整请求处理的顺序和方式。这使得系统更具可扩展性和灵活性。
  3. 支持动态决定请求的处理者:职责链模式允许根据具体的需求动态地决定请求的处理者。发送者不需要预先知道请求的处理者是谁,可以在运行时动态地组织处理者链。
  4. 可以在不同的层次上处理请求:职责链模式可以将处理者链建立在不同的层次上。这样一方面可以将相同层级上的处理者进行归类,方便管理,另一方面可以在不同层次上进行请求的处理,提高系统的灵活性。

 

缺点

  1. 请求可能无法被处理:由于没有明确的指定处理者,请求有可能在整个链上得不到处理,或者请求会被忽略而无法得到及时处理。
  2. 可能导致性能问题:如果处理者链过长,或者每个处理者的处理操作比较复杂,可能会导致性能问题。每个请求都需要遍历整个链直到找到合适的处理者。
  3. 可能导致系统变得复杂:职责链模式引入了额外的抽象层和处理者链的管理,可能会增加系统的复杂性和理解难度。

 

以下是一个简单的职责链模式的示例:

// 抽象处理者
abstract class Handler {
    protected Handler next;

    public void setNext(Handler next) {
        this.next = next;
    }

    public abstract void handleRequest(int request);
}

// 具体处理者A
class ConcreteHandlerA extends Handler {
    public void handleRequest(int request) {
        if (request >= 0 && request < 10) {
            System.out.println("ConcreteHandlerA 处理请求:" + request);
        } else if (next != null) {
            next.handleRequest(request);
        }
    }
}

// 具体处理者B
class ConcreteHandlerB extends Handler {
    public void handleRequest(int request) {
        if (request >= 10 && request < 20) {
            System.out.println("ConcreteHandlerB 处理请求:" + request);
        } else if (next != null) {
            next.handleRequest(request);
        }
    }
}

// 具体处理者C
class ConcreteHandlerC extends Handler {
    public void handleRequest(int request) {
        if (request >= 20 && request < 30) {
            System.out.println("ConcreteHandlerC 处理请求:" + request);
        } else if (next != null) {
            next.handleRequest(request);
        }
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandlerA();
        Handler handler2 = new ConcreteHandlerB();
        Handler handler3 = new ConcreteHandlerC();

        // 组织处理者链
        handler1.setNext(handler2);
        handler2.setNext(handler3);

        // 发送请求
        handler1.handleRequest(5);
        handler1.handleRequest(15);
        handler1.handleRequest(25);
        handler1.handleRequest(35);
    }
}

 

运行以上代码的输出结果应为:

ConcreteHandlerA 处理请求:5
ConcreteHandlerB 处理请求:15
ConcreteHandlerC 处理请求:25
请求无法处理

 

在上述示例中,抽象处理者(Handler)定义了处理请求的接口,并且包含了一个指向下一个处理者的引用。具体处理者(ConcreteHandler)继承了抽象处理者,并实现了实际的请求处理逻辑。客户端根据具体需求组织了处理者链,并发送请求给第一个处理者。

在示例中,处理者链依次是 ConcreteHandlerA、ConcreteHandlerB、ConcreteHandlerC。每个处理者都有自己的处理条件,如果请求满足条件,则处理请求;否则将请求传递给下一个处理者。当所有处理者都无法处理请求时,将输出"请求无法处理"。

职责链模式的核心思想在于将请求发送者和接收者解耦。发送者只需要知道如何发送请求,而无需关心具体的接收者是谁以及如何处理请求。每个具体处理者只关心自己能够处理的特定请求,当收到请求时,它可以选择执行操作,或者将请求传递给下一个处理者。这种方式使得系统的灵活性和可扩展性增强,而且可以动态地修改处理者链。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值