责任链模式

责任链模式

责任链模式:即将处理者组装成一个链表,当请求来到时,链表从首部开始,判断请求是否是自己应该执行的,若是,则自己执行,若不是,则传给下一个处理者。
角色: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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值