责任链模式
责任链模式:即将处理者组装成一个链表,当请求来到时,链表从首部开始,判断请求是否是自己应该执行的,若是,则自己执行,若不是,则传给下一个处理者。
角色:1.处理者:即在链表上的各个处理请求的角色
2.请求者:发送请求的角色。
具体实现:
这里采用古代妇女的三从四德模式。即在古代,妇女做什么事情都需要男人的同意。在未出嫁的时候,需要经过父亲的同意。在出嫁之后,需要经过丈夫的同意。在丈夫死后,需要经过儿子的同意。即处理者的顺序应该为:父亲-丈夫-儿子。妇女对应的角色为:女儿-妻子-母亲。
通用实现
1.创建抽象处理者
/**
* 抽象处理者
*有多少个处理者,就应该有多少个子类
*/
public abstract class Handler {
//设置各个处理者能处理的级别
public final static int FATHER = 1; //父亲
public final static int HUS = 2; //丈夫
public final static int SON = 3; //儿子
//自己能处理的级别
private int level = 0;
//责任传递,下一个责任人是谁
private Handler nextHandler;
//每个类都要说明自己能处理什么请求
public Handler(int level){
this.level = level;
}
//一个女性要逛街,你要处理这个请求
public final void HanderMessage(IWomen women){
if(women.gettype()==this.level){ //是自己应该处理的请求
this.response(women);
}else{
if(this.nextHandler!=null) //这条链上后面还有处理者
{
this.nextHandler.HanderMessage(women);
}
else{ //没有了,自己就是链上最后一个
System.out.println("没地方请示了,默认不同意");
}
}
}
/**
* 如果这个请求不是自己应该处理的,那么传递给下一个
* @param handler
*/
public void setNextHandler(Handler handler){
this.nextHandler = handler;
}
//回应请求
protected abstract void response(IWomen women);
}
2.创建父亲类-父亲处理者
/**
* 父亲类
*/
public class Father extends Handler{
public Father(){
super(Handler.FATHER);
}
@Override
protected void response(IWomen women) {
System.out.println("女儿向父亲请示:");
System.out.println(women.getRequest());
System.out.println("父亲同意了");
}
}
3.创建丈夫类-丈夫处理者
/**
* 丈夫类
*/
public class Hus extends Handler{
public Hus(){
super(Handler.HUS);
}
@Override
protected void response(IWomen women) {
System.out.println("妻子向丈夫请示:");
System.out.println(women.getRequest());
System.out.println("丈夫同意了");
}
}
4.创建儿子类-儿子处理者
/**
* 儿子类
*/
public class Son extends Handler{
public Son(){
super(Handler.SON);
}
@Override
protected void response(IWomen women) {
System.out.println("母亲向儿子请示:");
System.out.println(women.getRequest());
System.out.println("儿子同意了");
}
}
5.创建妇女接口-请求者
/**
* 抽象女性类
* 请求者
*/
public interface IWomen {
//得到自己的状态
public int gettype();
//获得个人请求
public String getRequest();
}
6.创建具体妇女实现类
/**
* 女性实现类
*/
public class Women implements IWomen {
/*
通过一个int类型的参数来描述妇女的个人状况
1--未出嫁
2--出嫁
3--丈夫死
*/
private int type = 0;
//妇女的请示
private String request = "";
public Women(int type,String request){
this.type = type;
switch (this.type){
case 1:
this.request="女儿的请求是:"+request;
break;
case 2:
this.request="妻子的请求是:"+request;
break;
case 3:
this.request="母亲的请求是:"+request;
break;
}
}
@Override
public int gettype() {
return this.type;
}
@Override
public String getRequest() {
return this.request;
}
}
7.创建场景测试类(随机五个妇女,进行测试)
/**
* 场景测试类
*/
public class Client {
public static void main(String[] args) {
Random random = new Random();
ArrayList<IWomen> arrayList = new ArrayList<>();
for(int i = 0;i<5;i++){
arrayList.add(new Women(random.nextInt(4),"出去逛街")); //随机请求级别
}
//定义三个请示对象
Handler father = new Father();
Handler hus = new Hus();
Handler son = new Son();
//设置请示顺序
father.setNextHandler(hus);
hus.setNextHandler(son);
for (IWomen women:arrayList) {
father.HanderMessage(women);
}
}
}