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