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