设计模式中职责链 chain of responsibility案例举例

news/2024/5/19 13:01:31 标签: 设计模式, 责任链模式, java

JAVA实现案例

职责链(Chain of Responsibility)模式是一种行为型模式,它将请求从发送者和接收者解耦,通过沿着一个链传递请求,使得可以多个对象都有机会处理请求。下面是一个简单的JAVA实现职责链模式的例子:

业务场景员工申请请假由经理审批,员工申请加薪则由总经理审批。

首先定义一个请求类 Request.java

java">public class Request {
    private String requestType;
    private String requestDescription;

    public Request(String type, String description) {
        this.requestType = type;
        this.requestDescription = description;
    }

    public String getRequestType() {
        return requestType;
    }

    public String getRequestDescription() {
        return requestDescription;
    }
}

然后定义一个抽象处理器类 Handler.java

java">public abstract class Handler {
    protected Handler successor;// 维持后继的责任对象

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    // 处理请求的方法
    public abstract void handleRequest(Request request);
}

接下来定义两个具体处理器类:CEOHandler.java和VPHandler.java。CEOHanlder可以批准所有请求,而VPHandler只能够处理某些特定类型的请求。

java">public class CEOHandler extends Handler {
    @Override
    public void handleRequest(Request request) {
        System.out.println("CEO can approve any request.");
    }
}

public class VPHandler extends Handler {
    @Override
    public void handleRequest(Request request) {
        if (request.getRequestType().equals("leave")) {
            System.out.println("VP can approve leave requests.");
        } else {
            // 如果自己不能处理的话,就将请求转发给后继者
            if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
}

最后,创建一个客户端类 Client.java

java">public class Client {
    public static void main(String[] args) {
        // 设置责任链
        CEOHandler ceoHandler = new CEOHandler();
        VPHandler vpHandler = new VPHandler();
        vpHandler.setSuccessor(ceoHandler);

        // 创建请求
        Request request1 = new Request("leave", "I want to take a leave today.");
        Request request2 = new Request("salary", "I want to increase my salary.");

        // 处理请求
        vpHandler.handleRequest(request1);
        vpHandler.handleRequest(request2);
    }
}

输出结果:

VP can approve leave requests.
CEO can approve any request.

这个例子中,CEOHandler担当责任链中的最后一个处理器,在它之前的处理器都没有能够处理请求时,请求会传递到CEOHandler中。而VPHandler只能够处理特定类型的请求,如果收到其他类型的请求,就会将请求传递给下一个处理器。

Python实现职责链模式

假设我们有一个餐厅系统,餐厅可以接收来自不同用户的点餐,但是每个用户都有不同的需求和特殊要求,因此我们需要一种技术来处理这些请求并将它们传递给正确的对象。在这种情况下,使用职责链模式是非常合适的。

下面是一个简单的职责链示例,用于处理来自客户端的点餐请求:

class Request:

    def __init__(self, meal_type, table_number, additional_request):
        self.meal_type = meal_type
        self.table_number = table_number
        self.additional_request = additional_request


class Handler:

    def __init__(self, successor=None):
        self.successor = successor

    def handle_request(self, request):
        if self.successor is not None:
            return self.successor.handle_request(request)


class WaiterHandler(Handler):

    def handle_request(self, request):
        if request.meal_type == "drink":
            print("Waiter serves drink to table", request.table_number)
            return True
        else:
            return super().handle_request(request)


class ChefHandler(Handler):

    def handle_request(self, request):
        if request.meal_type == "main_dish" and request.additional_request == "vegan":
            print("Chef prepares vegan dish for table", request.table_number)
            return True
        else:
            return super().handle_request(request)


class ManagerHandler(Handler):

    def handle_request(self, request):
        if request.meal_type == "complimentary_dish":
            print("Manager gives complimentary dish to table", request.table_number)
            return True
        else:
            return super().handle_request(request)

在这个示例中,我们有一个处理请求的基类Handler,以及三个具体处理类WaiterHandler、ChefHandler和ManagerHandler。每个类都有一个handle_request方法来处理来自客户端的请求。如果请求无法在当前处理程序中处理,它将被传递给职责链中的下一个处理程序,直到找到一个可以处理该请求的处理程序为止。

例如,如果客户端发出一个请求要求一道素菜作为主菜,在这种情况下,只有ChefHandler处理程序才能处理该请求。因此,该请求将由ChefHandler类进行处理并返回True。如果客户端请求一杯水,则将请求失败,因为WaiterHandler处理程序将优先处理所有无需特殊处理的请求。

C ++职责链模式举例

好的,下面是一个简单的 C++ 实现职责链模式的例子:

#include <iostream>
#include <string>

class Handler {
public:
    virtual void setNext(Handler* handler) = 0;
    virtual void handle(const std::string& request) = 0;
};

class BaseHandler : public Handler {
public:
    void setNext(Handler* handler) override {
        this->next = handler;
    }

    void handle(const std::string& request) override {
        if (this->next) {
            this->next->handle(request);
        }
    }

private:
    Handler* next = nullptr;
};

class ConcreteHandler1 : public BaseHandler {
public:
    void handle(const std::string& request) override {
        if (request == "one") {
            std::cout << "Handled by ConcreteHandler1" << std::endl;
        } else {
            BaseHandler::handle(request);
        }
    }
};

class ConcreteHandler2 : public BaseHandler {
public:
    void handle(const std::string& request) override {
        if (request == "two") {
            std::cout << "Handled by ConcreteHandler2" << std::endl;
        } else {
            BaseHandler::handle(request);
        }
    }
};

class ConcreteHandler3 : public BaseHandler {
public:
    void handle(const std::string& request) override {
        if (request == "three") {
            std::cout << "Handled by ConcreteHandler3" << std::endl;
        } else {
            BaseHandler::handle(request);
        }
    }
};

int main() {
    ConcreteHandler1 handler1;
    ConcreteHandler2 handler2;
    ConcreteHandler3 handler3;

    handler1.setNext(&handler2);
    handler2.setNext(&handler3);

    handler1.handle("one");
    handler1.handle("two");
    handler1.handle("three");
    handler1.handle("four");

    return 0;
}

运行结果:

Handled by ConcreteHandler1
Handled by ConcreteHandler2
Handled by ConcreteHandler3

在上面的例子中,Handler 类提供了处理请求的接口,并定义了设置下一个处理者的方法。BaseHandler 类实现了 Handler 接口,并提供了设置下一个处理者和调用下一个处理者的默认实现。

ConcreteHandler1、ConcreteHandler2 和 ConcreteHandler3 都继承自 BaseHandler,它们分别处理 “one”、“two” 和 “three” 请求,如果无法处理,则将请求交给下一个处理者来处理。

最后,在 main 函数中,我们可以构建出一条处理链,即 handler1 -> handler2 -> handler3。然后依次向 handler1 发送不同的请求,看看它们是否被正确地处理。

PHP案例

以下是职责链模式的PHP示例代码:


<?php

// 定义处理器接口
interface Handler
{
    public function setNext(Handler $handler): Handler;
    public function handle(Request $request): ?string;
}

// 请求类
class Request
{
    private $type;

    public function __construct(string $type)
    {
        $this->type = $type;
    }

    public function getType(): string
    {
        return $this->type;
    }
}

// 简单处理器实现
class SimpleHandler implements Handler
{
    private $nextHandler;

    public function setNext(Handler $handler): Handler
    {
        $this->nextHandler = $handler;
        return $handler;
    }

    public function handle(Request $request): ?string
    {
        if ($request->getType() === 'simple') {
            return 'SimpleHandler: 处理了请求类型为 simple 的请求。';
        }

        // 将请求传递给下一个处理器处理
        if ($this->nextHandler) {
            return $this->nextHandler->handle($request);
        }

        return null;
    }
}

// 复杂处理器实现
class ComplexHandler implements Handler
{
    private $nextHandler;

    public function setNext(Handler $handler): Handler
    {
        $this->nextHandler = $handler;
        return $handler;
    }

    public function handle(Request $request): ?string
    {
        if ($request->getType() === 'complex') {
            return 'ComplexHandler: 处理了请求类型为 complex 的请求。';
        }

        // 将请求传递给下一个处理器处理
        if ($this->nextHandler) {
            return $this->nextHandler->handle($request);
        }

        return null;
    }
}

// 客户端代码
$simpleHandler = new SimpleHandler();
$complexHandler = new ComplexHandler();

$simpleHandler->setNext($complexHandler);

// 处理简单请求
$request1 = new Request('simple');
$result1 = $simpleHandler->handle($request1);
echo $result1 . "\n";

// 处理复杂请求
$request2 = new Request('complex');
$result2 = $simpleHandler->handle($request2);
echo $result2 . "\n";

在这个示例中,我们定义了一个处理器接口 Handler,并实现了两个不同的处理器类 SimpleHandlerComplexHandler。这两个处理器类都实现了 Handler 接口,并且可以相互串联起来形成一个处理器链。在客户端代码中,我们首先创建了一个简单处理器和一个复杂处理器,并使用 setNext 方法将它们串联起来。然后,我们分别创建了一个简单请求和一个复杂请求,并将它们传递给处理器链中的第一个处理器(即简单处理器),让它们依次经过处理器链中的所有处理器进行处理。最终,我们得到了相应的处理结果。

职责链模式的主要思想就是将一个大的请求处理过程拆分成多个小的请求处理过程,并将它们串联起来形成一个处理器链,在客户端代码中依次将请求传递给处理器链中的第一个处理器,在处理器链中依次经过所有处理器进行处理,直到得到最终的结果。


http://www.niftyadmin.cn/n/282014.html

相关文章

如何进行物联网渗透测试?

渗透测试揭示了未知的安全漏洞&#xff0c;因为值得信赖的专业人员模拟威胁性攻击。他们深入挖掘固件和硬件&#xff0c;以查找漏洞和可访问性疏忽。 物联网(IoT)连接设备是严重且可预防的安全漏洞的意外来源&#xff0c;现在是时候像其他硬件一样对其进行渗透测试处理了。为什…

推荐算法实战项目:WideDeep原理以及案例实战(附完整 Python 代码)

本文要介绍的是Google于2016年提出的Wide&Deep模型&#xff0c;此模型的提出对业界产生了非常大的影响&#xff0c;不仅其本身成功地应用在多家一线互联网公司&#xff0c;而且其后续的改进工作也一直延续至今。 Wide&Deep模型正如其名&#xff0c;分别包含了Wide部分…

定位的特殊应用

注意&#xff1a;发生固定定位&#xff0c;绝对定位后&#xff0c;元素都变成了定位元素&#xff0c;默认高宽被内容撑开&#xff0c;则可以设置宽高&#xff1b;以下只针对绝对定位和固定定位的元素&#xff0c;不包括相对定位元素。 1.定位元素块的宽充满包含块 前提&#x…

LeetCode347. 前 K 个频繁元素

LeetCode347. 前 K 个频繁元素 题目 给定一个非空的整数数组&#xff0c;返回其中出现频率前 k 高的元素。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1]说明&#xff1a; 你可以假设给定的 k 总是合理的&#xff0c;且…

是不是在为 API 烦恼 ?好用免费的api接口大全呼之欲出

前期回顾 “ ES6 —— 让你的JavaScript代码从平凡到精彩 “_0.活在风浪里的博客-CSDN博客Es6 特性https://blog.csdn.net/m0_57904695/article/details/130408701?spm1001.2014.3001.5501 &#x1f44d; 本文专栏&#xff1a;开发技巧 先说本文目的&#xff0c;本文会分…

电脑中病毒了怎么修复,计算机Windows系统预防faust勒索病毒方法

随着计算机系统的不断发展&#xff0c;我们所面对的网络安全威胁也变得越来越严重。其中&#xff0c;较为常见且危险的威胁就是勒索病毒。随着勒索病毒加密算法的不断升级&#xff0c;最近faust勒索病毒开始流行。Faust勒索病毒主要的攻击目标是Windows操作系统&#xff0c;一旦…

JavaScript实现输入数值,判断是否为(任意)三角形的代码

以下为实现输入数值&#xff0c;判断是否为&#xff08;任意&#xff09;三角形的代码和运行截图 目录 前言 一、实现输入数值&#xff0c;判断是否为三角形 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 二、实现输入数值&#xff0c;判断是否为…

新人入职,都用这三招,让你安全度过试用期

刚入职工作 3招让你安全度过试用期 给新手小伙伴们分享几招 让你们能在试用期的时候平滑去度过 那么第一第一点就是 能自己解决的千万不要去问 千万不要去问 因为往往我们在去面试的时候 我们往往都是备足了很多的资料 备足了很多的面试题库 然后呢 你在给人家面试的时候总有一…