JAVA设计模式之【职责链模式】

摘要:
责任链模式是一种专门处理请求链转移的模式。处理程序的角色是抽象处理器。具体处理器是具体处理器。在责任链模式中,许多对象通过每个对象对其下属的引用连接成一个链。请求在此链上传递,直到链上的对象决定处理请求(=null){this.successor.handleRequest;}}}}5.副总经理包CoR/***由Jiqingon2016/10/22.*/publicclassViceGeneralManageextendsLeader//副总经理{publicViceGeneralManager{super;}Publicvoid handleRequest{if{System.out.println(“副总经理”+name+“批准员工”+request.getLeaveName()+“请假请求,请假天数为”+request.getLeaveDays()+”天。
职责链模式
	专门处理请求链式传递的模式
	角色
		Handler抽象处理者
		ConcreteHandler具体处理者
	在职责链模式中,很多对象由每一个对象对其下家的引用而连接成一条链,请求在这条链上传递,直到链上的某一个对象决定处理次请求。
	具体处理类的作用。
		1.处理请求,handleRequest。
		2.转发请求,如果该请求超出了当前处理类的权限,可以转发给下家。

看例子,批复休假

1.休假请求类

package CoR;

/**
 * Created by Jiqing on 2016/10/22.
 */
public class LeaveRequest // 休假请求
{
    private String leaveName; // 休假人
    private int leaveDays; // 休假天数

    public LeaveRequest(String leaveName,int leaveDays)
    {
        this.leaveName=leaveName;
        this.leaveDays=leaveDays;
    }

    public void setLeaveName(String leaveName) {
        this.leaveName = leaveName;
    }

    public void setLeaveDays(int leaveDays) {
        this.leaveDays = leaveDays;
    }

    public String getLeaveName() {
        return (this.leaveName);
    }

    public int getLeaveDays() {
        return (this.leaveDays);
    }
}

2.抽象处理类

public abstract class Leader // 抽象处理者
{
	protected String name;
	protected Leader successor;
	public Leader(String name)
	{
		this.name=name;
	}
	public void setSuccessor(Leader successor) 
	{ // 设置下一个处理者
		this.successor=successor;
	}
	public abstract void handleRequest(LeaveRequest request); // 处理请求
}

3.主任

package CoR;

/**
 * Created by Jiqing on 2016/10/22.
 */
public class Director extends Leader // 主任
{
    public Director(String name)
    {
        super(name);
    }
    public void handleRequest(LeaveRequest request)
    {
        if(request.getLeaveDays()<3) // 小于三天主任审批
        {
            System.out.println("主任" + name + "审批员工" + request.getLeaveName() + "的请假条,请假天数为" + request.getLeaveDays() + "天。");
        }
        else
        {
            if(this.successor!=null)
            {
                this.successor.handleRequest(request);
            }
        }
    }
}

4.经理

package CoR;

/**
 * Created by Jiqing on 2016/10/22.
 */
public class Manager extends Leader // 经理审批
{
    public Manager(String name)
    {
        super(name);
    }
    public void handleRequest(LeaveRequest request)
    {
        if(request.getLeaveDays()<10)
        {
            System.out.println("经理" + name + "审批员工" + request.getLeaveName() + "的请假条,请假天数为" + request.getLeaveDays() + "天。");
        }
        else
        {
            if(this.successor!=null)
            {
                this.successor.handleRequest(request);
            }
        }
    }
}

5.副总经理

package CoR;

/**
 * Created by Jiqing on 2016/10/22.
 */
public class ViceGeneralManager extends Leader // 副总经理
{
    public ViceGeneralManager(String name)
    {
        super(name);
    }
    public void handleRequest(LeaveRequest request)
    {
        if(request.getLeaveDays()<20)
        {
            System.out.println("副总经理" + name + "审批员工" + request.getLeaveName() + "的请假条,请假天数为" + request.getLeaveDays() + "天。");
        }
        else
        {
            if(this.successor!=null)
            {
                this.successor.handleRequest(request);
            }
        }
    }
}

6.总经理

package CoR;

/**
 * Created by Jiqing on 2016/10/22.
 */
public class GeneralManager extends Leader // 总经理审批
{
    public GeneralManager(String name)
    {
        super(name);
    }

    public void handleRequest(LeaveRequest request)
    {
        if(request.getLeaveDays()<30)
        {
            System.out.println("总经理" + name + "审批员工" + request.getLeaveName() + "的请假条,请假天数为" + request.getLeaveDays() + "天。");
        }
        else
        {
            System.out.println("莫非" + request.getLeaveName() + "想辞职,居然请假" + request.getLeaveDays() + "天。");
        }
    }
}

7.客户端

package CoR;

/**
 * Created by Jiqing on 2016/10/22.
 */
public class Client
{
    public static void main(String args[])
    {
        Leader objDirector,objManager,objGeneralManager,objViceGeneralManager;

        objDirector=new Director("王明");
        objManager=new Manager("赵强");
        objGeneralManager=new GeneralManager("李波");
        objViceGeneralManager=new ViceGeneralManager("肖红");

        // 建立职责链
        objDirector.setSuccessor(objManager); // 主任上级是经理
        objManager.setSuccessor(objViceGeneralManager); // 经理上级是副经理
        objViceGeneralManager.setSuccessor(objGeneralManager); // 副经理上级是总经理

        LeaveRequest lr1=new LeaveRequest("张三",2);
        objDirector.handleRequest(lr1);

        LeaveRequest lr2=new LeaveRequest("李四",5);
        objDirector.handleRequest(lr2);

        LeaveRequest lr3=new LeaveRequest("王五",15);
        objDirector.handleRequest(lr3);

        LeaveRequest lr4=new LeaveRequest("赵六",25);
        objDirector.handleRequest(lr4);
    }
}

亮点就在职责链上。

看结果:
主任王明审批员工张三的请假条,请假天数为2天。
经理赵强审批员工李四的请假条,请假天数为5天。
副总经理肖红审批员工王五的请假条,请假天数为15天。
总经理李波审批员工赵六的请假条,请假天数为25天。

JAVA设计模式之【职责链模式】第1张

免责声明:文章转载自《JAVA设计模式之【职责链模式】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Recordset属性与方法字符串右移下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

ARM debian的图形界面安装

所以这里选择安装lxde桌面。...

可用的rtmp互联网地址

Rtmp:vlc使用ffmpeg获取Rtmp网络流。代码文件路径:vlc-2.2.1 modulesassesavio。hvlc-2.2.1模块。c在模块的开放回调函数OpenAvio中,使用以下代码打开rtmp网络流。avio_打开(&amp;avio_FLAG_READ);//或者这个avio_open2(&amp;sys-&gt...

ubuntu的ufw如何开放特定端口?

ubuntu的ufw是如何打开特定端口的?1.安装sudoapt getinstallufw2.启用sudoufwenable以默认情况下禁用外部访问sudoufwdefaultdeny 3.查看状态sudoufwstatus4.添加端口sudoufwallow80805。删除端口sudoufwdeleteallow808080806。允许特定源的IP地址从...

Dto和Entity如何优雅的相互转换

什么是Dto,Entity,用来干什么?这个时候就有一个麻烦事,Entity和Dto的互转。通常的转换方法有两个途径,一个是通过反射的方式,来进行对象属性的复制;另一种是,通过硬编码进行对象属性的赋值;1.在service层中添加实体类转换函数@ServicepublicMyEntityService{publicSomeDtogetEntityById{S...

C# winform开发嵌套Chrome内核浏览器(WebKit.net)开发(一)

//Www.cnblogs.com/Maxq/p/6566558.htmlWebKit.net是WebKit的一个net包。使用它,。net程序可以非常方便地集成和使用webkit作为加载网页的容器。EventArgse){WebKit.WebKitBrowser=newWebKitBrowser();this.Controls.Add(浏览器);...

DB2字符函数简介及使用

Param2可以是编码单元16-16位UTF-16编码,也就是说,字符串表示为16位UTF-18编码字符串。Codeunits32-32位UTF-32编码,即字符串表示为32位UTF 32编码字符串。请注意,定义为FORBITDATA的字符串不能转换为图形字符。如果length<length,则来自的原始字符串短于结果中的长度。...