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);
}
}