责任链模式-Chain of Responsibility

名称:

    责任链模式 (Chain of Responsibility Pattern)-对象行为型模式

 

问题:

    The Chain of Responsibility pattern establishes a chain within a system, so that a message can either be handled at the level where it is first received, or be directed to an object that can handle it.

    使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

 

适用性:

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

    -你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

    -可处理一个请求的对象集合应被动态指定。

 

协作:

    当客户提交一个请求时。请求沿链传递直至有一个ConcreteHandler对象负责处理它。

 

优点和缺点:

    1、降低耦合度。该模式使得一个对象无需知道是其他哪一个对象处理其请求。

    2、增强了给对象指派职责的灵活性。当在对象中分配职责时,职责链给你更多的灵活性。

    3、不保证被接受

 

解决方案:

    

1、 模式的参与者

    1、Handler

    -定义一个处理请求的接口。

    -(可选)实现后继链。

    2、ConcreteHandler

    -处理它所负责的请求。

    -可访问它的后继者。

    -如果可处理该请求,就处理之;否则将该请求转发给它的后继者。

    3、Client

    -向链上的具体处理者对象提交请求。

 

2.实现方式

复制代码
abstract class Handler
{
    private Handler next;
    public void setNext(Handler next)
    {
        this.next=next; 
    }
    public Handler getNext()
    { 
        return next; 
    }   
    public abstract void handleRequest(String request);       
}
复制代码
复制代码
class ConcreteHandler1 extends Handler
{
    public void handleRequest(String request)
    {
        if(request.equals("Handler1")) 
        {
            System.out.println("process on Handler1!");       
        }
        else
        {
            if(getNext()!=null) 
            {
                getNext().handleRequest(request);             
            }
            else
            {
                System.out.println("no processor");
            }
        } 
    } 
}
复制代码
复制代码
class ConcreteHandler2 extends Handler
{
    public void handleRequest(String request)
    {
        if(request.equals("Handler2")) 
        {
            System.out.println("process on Handler2!");       
        }
        else
        {
            if(getNext()!=null) 
            {
                getNext().handleRequest(request);             
            }
            else
            {
                System.out.println("no processor");
            }
        } 
    }
}
复制代码

 

复制代码
public class ChainOfResponsibilityPattern
{
    public static void main(String[] args)
    {
        
        Handler handler1=new ConcreteHandler1(); 
        Handler handler2=new ConcreteHandler2(); 
        handler1.setNext(handler2); 
        handler1.handleRequest("two");
    }
}
复制代码

 

 

参考资料

《设计模式:可复用面向对象软件的基础》

posted @   diameter  阅读(172)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示