责任链模式-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 @ 2020-06-29 17:48  diameter  阅读(171)  评论(0编辑  收藏  举报