设计模式之责任链模式17
背景
古代之三从四德,未婚从父,已婚从夫,丧父从子。女子如果想去逛街,先得请示父亲,如果父亲不在则请求丈夫,如果丈夫不在则请求儿子。抽象一下表达。
对象拆分:女人(女子),男人(父亲,丈夫,儿子),动作拆分:男子批准女子的逛街请求。男子对象拥有该动作。(基于,谁拥有动作,方法则属于那个对象)
类图
代码实现
抽象女子接口
public interface IWoman {
//获取女子的级别,三从四德,1未婚,2已婚,3丧夫
public int getType();
//获取女子的各种请求
public String getRequest();
}
具体的定义一个妹子
public class Woman implements IWoman{
//级别,1未婚,2已婚,3丧夫
private int type = 0;
//请求内容
private String request = "";
public Woman(int _type, String _request) {
this.type = _type;
this.request = _request;
}
public int getType() {
return type;
}
public String getRequest() {
return request;
}
}
男子对象抽象类,用来被父亲,丈夫,儿子所继承
public abstract class Handler {
//对应的级别,1父亲,2丈夫,3儿子
private int type;
//如果该环节无法处理,那么下一个节点处理
private Handler next;
public Handler(int _type) {
this.type = _type;
}
public void setNext(Handler _next) {
this.next = _next;
}
public void handleMessage(Woman woman) {
if(woman.getType() == this.type) {
this.response(woman);
}else {
if(next != null) {
this.next.handleMessage(woman);
}else {
System.out.println("没人了,无法传递");
}
}
}
public abstract void response(Woman woman);
}
父亲
public class Father extends Handler {
public Father(int _type) {
super(1);
}
@Override
public void response(Woman woman) {
System.out.println("请求得到父亲的同意");
System.out.println(woman.getRequest());
System.out.println("父亲:已同意\n");
}
}
丈夫
public class Husband extends Handler {
public Husband(int _type) {
super(2);
}
@Override
public void response(Woman woman) {
System.out.println("请求得到丈夫的同意");
System.out.println(woman.getRequest());
System.out.println("丈夫:已同意\n");
}
}
儿子
public class Son extends Handler {
public Son(int _type) {
super(3);
}
@Override
public void response(Woman woman) {
System.out.println("请求得到儿子的同意");
System.out.println(woman.getRequest());
System.out.println("儿子:已同意\n");
}
}
客户端调用
public class Client {
public static void main(String[] args) {
Handler father = new Father(1);
Handler husband = new Husband(2);
Handler son = new Son(3);
father.setNext(husband);
husband.setNext(son);
for(int i=0; i<5; i++) {
int a = new Random().nextInt(3) + 1;
Woman woman = new Woman(a, "我想去逛街");
father.handleMessage(woman);
}
}
}
运行结果
请求得到父亲的同意
我想去逛街
父亲:已同意
请求得到父亲的同意
我想去逛街
父亲:已同意
请求得到丈夫的同意
我想去逛街
丈夫:已同意
请求得到父亲的同意
我想去逛街
父亲:已同意
请求得到儿子的同意
我想去逛街
儿子:已同意