1類圖
2定義:
很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
3應用場景:
3.1 多個對象可以處理同一個請求,但具體由那個對象則在運行時動態決定。
3.2 在請求處理者的情況下向多個對象中的一個提交一個請求。
3.3 需要動態指定一組對象處理請求。
通用模板:
4抽象處理者
public abstract class Handler {
protected Handler successor;
public abstract void handleRequest (String condition);
}
5具體處理者1
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest (String condition) {
if (condition.equals("ConcreteHandler1" )){
System.out.println("ConcreteHandler1 handled" );
return ;
}else {
successor.handleRequest(condition);
}
}
}
6具體處理者2
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest (String condition) {
if (condition.equals("ConcreteHandler2" )){
System.out.println("ConcreteHandler2 handled" );
return ;
}else {
successor.handleRequest(condition);
}
}
}
7測試
public class Client {
public static void main (String[] args) {
ConcreteHandler1 handler1 = new ConcreteHandler1();
ConcreteHandler2 handler2 = new ConcreteHandler2();
handler1.successor = handler2;
handler2.successor = handler1;
handler1.handleRequest("ConcreteHandler2" );
}
}
簡單實現:
8抽象領導類
public abstract class Leader {
protected Leader nextHandler;
public final void handleRequest (int money){
if (money <= limit()){
handle(money);
}else {
if (null != nextHandler)
nextHandler.handleRequest(money);
}
}
public abstract int limit ();
public abstract void handle (int money);
}
9組長類
public class GroupLeader extends Leader {
@Override
public int limit () {
return 1000 ;
}
@Override
public void handle (int money) {
System.out.println("組長批覆報銷: " + money + "元" );
}
}
10主管類
public class Director extends Leader {
@Override
public int limit () {
return 5000 ;
}
@Override
public void handle (int money) {
System.out.println("主管批覆報銷: " + money + "元" );
}
}
11經理類
public class Manager extends Leader {
@Override
public int limit () {
return 10000 ;
}
@Override
public void handle (int money) {
System.out.println("經理批覆報銷: " + money + "元" );
}
}
12老闆類
public class Boss extends Leader {
@Override
public int limit () {
return Integer.MAX_VALUE;
}
@Override
public void handle (int money) {
System.out.println("老闆批覆報銷: " + money + "元" );
}
}
13測試類
public class Test {
public static void main (String[] args) {
GroupLeader groupLeader = new GroupLeader();
Director director = new Director();
Manager manager = new Manager();
Boss boss = new Boss();
groupLeader.nextHandler = director;
director.nextHandler = manager;
manager.nextHandler = boss;
groupLeader.handleRequest(9000 );
}
}