设计模式-职责链

  1. 意图
  2. 例子
  3. 适用性
  4. 结构
  5. 协作
  6. 效果

意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

例子

有点像按钮点击,当我们点击按钮后,点击事件并不是直接传递给这个按钮,而是一层一层向下传递。

window -> groupView -> view

首先是点击事件
public abstract class Handler {
public int thisType;
public void click(int testType);
}

然后是组件父类
public abstract class Weight extends Handler {
Weight parent;
public Weight(Weight w, int thisType) {
this.parent = w;
this.thisType = thisType;
}
public abstract void click(int testType);
}

接下来就可以使用它来构建控件了
public class Button extends Weight {
public Button(Weight w, int thisType) {
super(w, thisType);
}

public void click(int testType) {
if (testType == thisType) {
System.out.println("BUTTON Click")
} else {
w.click(testType);
}
}
}

public class TextView extends Weight {
public TextView(Weight w, int thisType) {
super(w, thisType);
}

public void click(int testType) {
if (testType == thisType) {
System.out.println("TEXTVIEW Click")
} else {
w.click(testType);
}
}
}

public class SwitchView extends Weight {
public SwitchView(Weight w, int thisType) {
super(w, thisType);
}

public void click(int testType) {
if (testType == thisType) {
System.out.println("SWITCHVIEW Click");
} else if (w != null) {
w.click(testType);
} else {
System.out.println("该链无法完成任务");
}
}
}

接下来,创建这个链
public class Test {
public static void main(String[] arg) {
Weight w = new SwitchView(new Button(new TextView(null, 0), 1), 2);
w.click(5);
}
}

这里的点击事件如果提供返回值,则可以将参数中的责任移动到函数的返回值来处理。

适用性

  1. 有多个的对象可以处理一个请求,具体哪个对象来处理,可以在运行时觉得。
  2. 想在不明确指定接收者的情况下,在多个对象中的有一个提交一个请求。
  3. 可处理一个请求的对象集合应被动态指定。

结构

github

协作

当客户提交一个请求时,请求沿链传递直至有一个 ConcreteHandler 对象负责处理它。

效果

职责链链有下列优点和缺点 :

  1. 降低耦合度
    该模式使得一个对象无需知道是其他哪一个对象处理其请求。对象仅需知道该请求会被“正确”地处理。接收者和发送者都没有对方的明确的信息,且链中的对象不需知道链的结构。结果是,职责链可简化对象的相互连接。它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用。
  2. 增强了给对象指派职责的灵活性
    当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。
  3. 不保证被接受
    既然一个请求没有明确的接收者,那么就不能保证它一定会被处理 — 该请求可能一直到链的末端都得不到处理。一个请求也可能因该链没有被正确配置而得不到处理。