1.定义
很多的对象由每一个对象对其下家的引用而联结起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态的重新组织链和分配责任。
2.UML类图
3.角色
抽象处理者:定义出一个请求处理的接口,假如需要,接口可以定义出一个方法,以返回对下家的引用。
具体处理者:处理接受到的请求,可以将请求处理掉或者传递给下就家。
抽象请求者:定义一个抽象的请求者
具体请求者:具体的请求者
4.适用场合
系统中已经有一个由处理者对象组成的链。这个链可能由复合模式给出。第二、当有多于一个的处理者对象会处理一个请求,而且在事先并不知道到底由哪一个处理者对象处理一个请求。这个处理者对象是动态确定的。第三、当系统想发出一个请求给多个处理者对象中的某一个,但是不明显指定是哪一个处理者对象会处理请求。第四、当处理一个请求的处理者对象集合需要动态的指定时。
5.代码
抽象处理者:
package com.designpattern.chain;
/**
* 抽象处理者
*
* @author wujinsong
*/
public abstract class Handler {
/**
* 能处理的级别
*/
private int level = 1;
/**
* 下一个处理人是谁
*/
private Handler nextHandler;
public Handler(int level) {
this.level = level;
}
/**
* 处理请求
*
* @param woman the Woman 妇女对象
*/
public final void handleMessage(IWoman woman) {
if (woman.getType() == this.level) {
this.response(woman);
}
else {
if (this.nextHandler != null) {
this.nextHandler.handleMessage(woman);
}
else {
System.out.println("不作处理");
}
}
}
/**
* 下一个处理者
*
* @param nextHandler
*/
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
/**
* 应答
*
* @param woman
*/
public abstract void response(IWoman woman);
}
具体处理者:父亲
package com.designpattern.chain;
/**
* 具体处理者父亲
*
* @author wujinsong
*/
public class Father extends Handler {
public Father() {
super(1);
}
@Override
public void response(IWoman woman) {
System.out.println("女儿的要求:" + woman.getRequest());
System.out.println("父亲的回答:同意");
}
}
具体处理者:丈夫
package com.designpattern.chain;
/**
* 具体处理者丈夫
*
* @author wujinsong
*/
public class Husband extends Handler {
public Husband() {
super(2);
}
@Override
public void response(IWoman woman) {
System.out.println("妻子的要求:" + woman.getRequest());
System.out.println("丈夫的回答:同意");
}
}
具体处理者:儿子
package com.designpattern.chain;
/**
* 具体处理者儿子
*
* @author wujinsong
*/
public class Son extends Handler {
public Son() {
super(3);
}
@Override
public void response(IWoman woman) {
System.out.println("母亲的要求:" + woman.getRequest());
System.out.println("儿子的回答:同意");
}
}
抽象请求者:
package com.designpattern.chain;
/**
* 抽象请求者
*
* @author wujinsong
*/
public interface IWoman {
/**
* 个人情况
*
* @return the int 个人情况
*/
public int getType();
/**
* 获取个人请求
*
* @return the String 获取 个人请求
*/
public String getRequest();
}
具体请求者:
package com.designpattern.chain;
/**
* 具体请求者
*
* @author wujinsong
*/
public class Woman implements IWoman {
/**
* 个人情况
* 1---未出嫁
* 2---出嫁
* 3---丈夫外出
*/
private int type = 0;
/**
* 妇女的请示
*/
public String request = "";
/**
* 构造函数
*
* @param type 妇女状态
* @param request 请求
*/
public Woman(int type, String request) {
this.type = type;
switch (type) {
case 1:
this.request = "女儿的请求是:" + request;
break;
case 2:
this.request = "妻子的请求是:" + request;
break;
case 3:
this.request = "母亲的请求是:" + request;
break;
default:
break;
}
}
public int getType() {
return type;
}
public String getRequest() {
return request;
}
}