責任鏈模式的定義如下:
是多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它位置。
責任鏈模式的通用類圖如下:
下面以《設計模式之禪》中的例子說明一下,中國古代對父母制定了“三從四德”的規範,所謂“三從”指“未嫁從父,既嫁從夫,夫死從子”,下面就用責任鏈模式來說明一下“三從”,加入一個女人要出門逛街,在出嫁之前需要徵得父親的同意,出嫁之後需要得到丈夫的同意,丈夫如果死了需要得到兒子的同意.
代碼如下:
public abstract class Handler {
public final static int FATHER_LEVEL_RWQUESR = 1;
public final static int HUSBAND_LEVEL_RWQUESR = 2;
public final static int SON_LEVEL_RWQUESR = 3;
private int level = 0;
// 下一責任人
private Handler nextHandler;
public Handler(int level) {
this.level = level;
}
public final void handleMessage(IWomen women) {
if (level == women.getType()) {
this.response(women);
} else {
if (nextHandler != null) {
nextHandler.handleMessage(women);
} else {
System.out.println("沒有地方請示了,按不同意處理");
}
}
}
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
/**
* @param women
*/
protected abstract void response(IWomen women);
}
public class Father extends Handler {
/**
* @param level
*/
public Father() {
super(FATHER_LEVEL_RWQUESR);
}
/**
* @param women
* @see com.huashao.chapter.chapter16.Handler#response(com.huashao.chapter.chapter16.IWomen)
*/
@Override
protected void response(IWomen women) {
System.out.println(women.getRequest());
System.out.println("父親的答覆:同意");
}
}
public class Husband extends Handler {
/**
* @param level
*/
public Husband() {
super(HUSBAND_LEVEL_RWQUESR);
}
/**
* @param women
* @see com.huashao.chapter.chapter16.Handler#response(com.huashao.chapter.chapter16.IWomen)
*/
@Override
protected void response(IWomen women) {
System.out.println( women.getRequest());
System.out.println("丈夫的答覆是:同意");
}
}
public class Son extends Handler {
/**
* @param level
*/
public Son() {
super(SON_LEVEL_RWQUESR);
}
/**
* @param women
* @see com.huashao.chapter.chapter16.Handler#response(com.huashao.chapter.chapter16.IWomen)
*/
@Override
protected void response(IWomen women) {
System.out.println( women.getRequest());
System.out.println("兒子的答覆是:同意");
}
}
public interface IWomen {
int getType();
String getRequest();
}
public class Women implements IWomen {
/**
* 通過int類型的參數來描述婦女的個人狀況 1--未出嫁 2--出嫁 3--夫死
*/
private int type = 0;
private String message;// 婦女的請示
public Women(int type, String message) {
this.type = type;
switch (type) {
case 1:
this.message = "女兒的請求是:" + message;
break;
case 2:
this.message = "妻子的請求是:" + message;
break;
case 3:
this.message = "母親的請求是:" + message;
break;
}
}
/**
* @return
* @see com.huashao.chapter.chapter16.IWomen#getType()
*/
@Override
public int getType() {
// TODO Auto-generated method stub
return type;
}
/**
* @return
* @see com.huashao.chapter.chapter16.IWomen#getRequest()
*/
@Override
public String getRequest() {
// TODO Auto-generated method stub
return message;
}
}
public class Client {
public static void main(String[] args) {
Random random = new Random();
List<IWomen> list = new ArrayList<IWomen>();
for (int i = 0; i < 5; i++) {
list.add(new Women(random.nextInt(4), "我要出去逛街"));
}
Handler father = new Father();
Handler husband = new Husband();
Handler son = new Son();
father.setNextHandler(husband);
husband.setNextHandler(son);
for (IWomen women : list) {
father.handleMessage(women);
}
}
}