设计模式学习之职责链模式

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

 

 

2、UML

设计模式学习之职责链模式

 

设计模式学习之职责链模式

ConcreteHandler1、ConcreteHandler2 :具体处理者类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给他的后继者。

 

 

3、职责链的好处

关键在与当客户提交一个请求时,请求是沿着链传递直至由一个ConcreateHander对象负责处理它

请求者不用管哪个对象来处理,反正该请求会被处理就是了

接受者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构。结果是职责链可简化对象的互相连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接受者的引用,大大降低了耦合度

我们可以随时的增加或修改一个请求的结构,增强了给对象指派职责的灵活性

4、实例:

 请求类

package com.zcr.chain;
//申请
public class Request
{
    //申请类别
    private String requestType;
   
    //申请内容
    private String requestContent;
   
    //数量
    private int number;

public String getRequestType()
    {
        return requestType;
    }

public void setRequestType(String requestType)
    {
        this.requestType = requestType;
    }

public String getRequestContent()
    {
        return requestContent;
    }

public void setRequestContent(String requestContent)
    {
        this.requestContent = requestContent;
    }

public int getNumber()
    {
        return number;
    }

public void setNumber(int number)
    {
        this.number = number;
    }
   
   
}

package com.zcr.chain;

//管理者
public abstract class Manager
{
    protected String name;
   
    public Manager()
    {
       
    }
   
    //管理者的上级
    protected Manager superior;
   
    public Manager(String name)
    {
        this.name = name;
    }
   
    //设置管理者的上级
    public void SetSuperior(Manager superior)
    {
        this.superior = superior;
    }
   
    //申请请求
    abstract public void RequestApplications(Request request);
}

package com.zcr.chain;
//经理
public class Majordomo extends Manager
{

public Majordomo(String name)
    {
        this.name = name;
    }
   
    @Override
    public void RequestApplications(Request request)
    {
        //经理所能有的权限就是可准许下属5天内的假期
        if(request.getRequestType().equals("请假") && request.getNumber() <= 5)
        {
            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");
        }
        else
        {
            //其余的申请都需转到上级
            if(null != superior)
            {
                superior.RequestApplications(request);
            }
        }

}

}

package com.zcr.chain;
//总经理
public class GeneralManager extends Manager
{

public GeneralManager(String name)
    {
        this.name = name;
    }
   
   
    @Override
    public void RequestApplications(Request request)
    {
        //总经理允许任意时间假期
        if(request.getRequestType().equals("请假"))
        {
            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");
        }
        else if(request.getRequestType().equals("加薪") && request.getNumber() <=500)
        {
            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"被批准");
        }
        else if(request.getRequestType().equals("加薪") && request.getNumber() >500)
        {
            System.out.println(name+":"+request.getRequestContent()+"数量"+request.getNumber()+"再说把");
        }
    }
   
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/02cfd692dd5b3a8d0e9901334cff7c8b.html