对《大话设计模式》的学习总结,以备后用。
职责链模式:
职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
Handler
类定义了一个处理请求的接口:
public abstract class Handler {
protected Handler successor;
// 设置继任者
public void setSuccessor(Handler successor) {
this.successor = successor;
}
// 处理请求的抽象接口
public abstract void handleRequest(int request);
}
concreteHandler
是具体处理类,如concreteHandler1
、concreteHandler2
,从uml图看出需继承Handler
类和实现handleRequest
方法。
concreteHandler1
实现:
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(int request) {
// 满足条件则处理
if(request > 0 && request < 10) {
System.out.println("ConcreteHandler1 处理了请求: " + request);
}else { // 不满足则传递给继任者
this.successor.handleRequest(request);
}
}
}
concreteHandler2
实现:
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(int request) {
// 满足条件则处理
if(request >= 10 && request < 20) {
System.out.println("ConcreteHandler2 处理了请求: " + request);
}else { // 不满足则传递给继任者
this.successor.handleRequest(request);
}
}
}
concreteHandler3
实现:
public class ConcreteHandler3 extends Handler {
@Override
public void handleRequest(int request) {
// 满足条件则处理
if(request >= 20 && request < 30) {
System.out.println("ConcreteHandler3 处理了请求: " + request);
}else { // 不满足则传递给继任者
this.successor.handleRequest(request);
}
}
}
- 客户端代码实现,向链上的具体处理对象提交请求:
public class App
{
public static void main( String[] args )
{
Handler h1 = new ConcreteHandler1();
Handler h2 = new ConcreteHandler2();
Handler h3 = new ConcreteHandler3();
// 设置继任者
h1.setSuccessor(h2);
h2.setSuccessor(h3);
//从链的起始端开始处理请求
int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};
for(int i = 0; i < requests.length; i++) {
h1.handleRequest(requests[i]);
}
}
}
职责链的特点:
- 当客户提交一个请求时,请求沿链传递直至有一个
ConcreteHandler
对象负责处理它。 - 职责链可简化为对象之间的相互连接,它们仅需保持一个指向其后继者的引用,而无需保持所有候选接受者的引用。
- 随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。
- 一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。
网友评论