Skip to content

职责链(Chain of Responsibility)模式 行为型模式

更新: 2023-05-24 11:11:27   字数: 0 字   时长: 0 分钟

把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。

c#
// 职责链模式示例
using System;

// 定义一个抽象类,表示处理请求的抽象类
public abstract class Handler
{
    protected Handler successor; // 定义一个后继对象

    public void SetSuccessor(Handler successor) // 设置后继对象
    {
        this.successor = successor;
    }

    public abstract void HandleRequest(int request); // 处理请求的抽象方法
}

// 具体处理者类1
public class ConcreteHandler1 : Handler
{
    public override void HandleRequest(int request) // 实现处理请求的方法
    {
        if (request >= 0 && request < 10) // 如果请求在0到10之间,则处理请求
        {
            Console.WriteLine($"{this.GetType().Name} 处理请求 {request}");
        }
        else if (successor != null) // 否则将请求传递给下一个处理者
        {
            successor.HandleRequest(request);
        }
    }
}

// 具体处理者类2
public class ConcreteHandler2 : Handler
{
    public override void HandleRequest(int request) // 实现处理请求的方法
    {
        if (request >= 10 && request < 20) // 如果请求在10到20之间,则处理请求
        {
            Console.WriteLine($"{this.GetType().Name} 处理请求 {request}");
        }
        else if (successor != null) // 否则将请求传递给下一个处理者
        {
            successor.HandleRequest(request);
        }
    }
}

// 具体处理者类3
public class ConcreteHandler3 : Handler
{
    public override void HandleRequest(int request) // 实现处理请求的方法
    {
        if (request >= 20 && request < 30) // 如果请求在20到30之间,则处理请求
        {
            Console.WriteLine($"{this.GetType().Name} 处理请求 {request}");
        }
        else if (successor != null) // 否则将请求传递给下一个处理者
        {
            successor.HandleRequest(request);
        }
    }
}

// 客户端类
public class Client
{
    public void Run()
    {
        // 创建处理者对象
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        Handler h3 = new ConcreteHandler3();

        //设置处理者对象的后继对象
        h1.SetSuccessor(h2);
        h2.SetSuccessor(h3);

        // 发送请求
        int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

        foreach (int request in requests)
        {
            h1.HandleRequest(request);
        }
    }
}
你觉得这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度