JAVA設計模式之【職責鏈模式】


職責鏈模式
	專門處理請求鏈式傳遞的模式
	角色
		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天。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM