责任链模式的定义如下:
是多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它位置。
责任链模式的通用类图如下:
下面以《设计模式之禅》中的例子说明一下,中国古代对父母制定了“三从四德”的规范,所谓“三从”指“未嫁从父,既嫁从夫,夫死从子”,下面就用责任链模式来说明一下“三从”,加入一个女人要出门逛街,在出嫁之前需要征得父亲的同意,出嫁之后需要得到丈夫的同意,丈夫如果死了需要得到儿子的同意.
代码如下:
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);
}
}
}