chain of responsibility - 對象行爲型模式

     1.意圖
                使多個對象都有機會處理請求,從而避免發送者和接收者的耦合關係。將一些
                對象連成一條鏈。並沿着這條鏈傳遞請求,直到有一個對象處理它爲止
      2.參與者
      Handler -定義一個請求接口
              -(可先)實現一個後繼鏈
      ConcreteHandler - 處理它所負責的請求
                      - 可訪問它的後繼者
      Client   - 向鏈上的具體處理者提交請求

 3.結構

4.代碼

public interface Handler {
	void handlerHelp(Request r);

	void next(Handler h);
}

public class Request {
	private String topic;
	private String content;

	public String getTopic() {
		return topic;
	}

	public void setTopic(String topic) {
		this.topic = topic;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

}

public class ConcreteHandlerA implements Handler {
	private List<String> topicList;
	private Handler nextHandler;

	ConcreteHandlerA() {
		topicList = new ArrayList<String>();
		topicList.add("A");
		topicList.add("B");
		topicList.add("C");
	}

	@Override
	public void handlerHelp(Request r) {
		String topic = r.getTopic();
		if (topic != null) {
			if (topicList.contains(topic)) {
				System.out.println("ConcreteHandlerA konw " + topic);
			}
		}
		if (nextHandler != null) {
			nextHandler.handlerHelp(r);
		}
	}

	@Override
	public void next(Handler h) {
		this.nextHandler = h;

	}

}

public class ConcreteHandlerB implements Handler {

	private List<String> topicList;
	private Handler nextHandler;

	ConcreteHandlerB() {
		topicList = new ArrayList<String>();
		topicList.add("D");
		topicList.add("E");
		topicList.add("F");
	}

	@Override
	public void handlerHelp(Request r) {
		String topic = r.getTopic();
		if (topic != null) {
			if (topicList.contains(topic)) {
				System.out.println("ConcreteHandlerB konw " + r.getContent());
			}
		}
		if (nextHandler != null) {
			nextHandler.handlerHelp(r);
		}
	}

	@Override
	public void next(Handler h) {
		this.nextHandler = h;

	}

}

public class ConcreteHandlerC implements Handler {

	private List<String> topicList;
	private Handler nextHandler;

	ConcreteHandlerC() {
		topicList = new ArrayList<String>();
		topicList.add("I");
		topicList.add("J");
		topicList.add("K");
	}

	@Override
	public void handlerHelp(Request r) {
		String topic = r.getTopic();
		if (topic != null) {
			if (topicList.contains(topic)) {
				System.out.println("ConcreteHandlerC konw " + topic+":"+r.getContent());
			}
		}
		if (nextHandler != null) {
			nextHandler.handlerHelp(r);
		}
	}

	@Override
	public void next(Handler h) {
		this.nextHandler = h;

	}

}


public class Client {
	public static void main(String[] args) {
		ConcreteHandlerA A =new ConcreteHandlerA();
		ConcreteHandlerB B =new ConcreteHandlerB();
		ConcreteHandlerC C =new ConcreteHandlerC();
		A.next(B);B.next(C);
		Request r = new Request();
		r.setTopic("H");
		r.setContent("hao are you!");
		A.handlerHelp(r);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章