動態的 職責鏈模式

職責鏈模式

使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關係。將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理它爲止。

責任鏈模式降低了請求的發送端和接收端之間的耦合,使多個對象都有機會處理這個請求。

角色

  • 抽象處理者(Handler)角色
    定義出一個處理請求的接口。 如果需要,接口可以定義出一個方法,以設定和返回對下家的引用。這個角色 通常由一個抽象類或接口實現
  • 具體處理者(ConcreteHandler)角色
    具體處理者接到請求後,可以選擇將請求處理掉,或者將請求傳給下家。
    由於具體處理者持有對下家的引用,因此,如果需要, 具體處理者可以訪問下家。

本質

  • 分離職責,動態組合

優點

  • 請求者和接收者鬆散耦合
  • 動態組合職責

缺點

  • 產生很多細粒度對象
  • 不一定能被處理
    需要提供默認處理

在這裏插入圖片描述

處理請示的接口:

public class Handler {

	protected Handler successor;
	
	public void setSuccessor(Handler successor) {
		this.successor=successor;
	}
	public void HandleRequest(int request) {}
}

具體處理請求的類:

public class ConcreteHandler1 extends Handler {

	public void HandleRequest(int request) {
		if (request >= 0 && request < 10) {
			System.out.println("ConcreteHandler1 處理了請求" + request);
		} else if (successor != null) {
			successor.HandleRequest(request);
		}
	}
}
public class ConcreteHandler2 extends Handler {

	public void HandleRequest(int request) {
		if (request >= 10 && request < 20) {
			System.out.println("ConcreteHandler2 處理了請求" + request);
		} else if (successor != null) {
			successor.HandleRequest(request);
		}
	}
}
public class ConcreteHandler3 extends Handler {

	public void HandleRequest(int request) {
        if (request >= 20 && request < 30) {
            System.out.println("ConcreteHandler3 處理了請求" + request);
        } else if (successor != null) {
            successor.HandleRequest(request);
        }
    }
}

測試類:

public class Main {
	public static void main(String[] args) {
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();
        Handler h3 = new ConcreteHandler3();
        h1.setSuccessor(h3);
        h3.setSuccessor(h2);

        int[] requests = {1, 2, 3, 11, 12, 13, 21, 22, 23, 99};
        for (int request : requests) {
            h1.HandleRequest(request);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章