责任链模式

责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

下面做了一个责任链模式的小案例,大概内容是:我饿了,想让家里人给我做饭。

次序:妈妈->爸爸->爷爷->奶奶->外卖->我自己做饭。结尾,如果都很忙,那我自己做饭。

在责任链模式中,我发出请求后,这个链上的任何人都有机会处理这个请求,如果某一个人没有解决该请求,则会将请求传递给下一个处理者,直到请求被解决,需要注意,设计责任链时,如果一个到了链的末端依然没有解决,这种情况不应该出现,设计时应该注意。

/**
 * @Date 2022/1/13 22:15
 * @Description 外卖类
 **/
public class Waimai extends Handler {

    public Waimai(boolean isBusy){
        setBusy(isBusy);
    }

    @Override
    public void handerRequest() {
        if(this.isBusy()){
            successor.setBusy(false);
            setSuccessor(this.successor);
            System.out.println("外卖:您的前面有300人排队,大约需要等待2小时");
        }else {
            System.out.println("外卖:已接单,您的外卖正在处理中……");
            setBusy(false);
        }
    }
}
/**
 * @Date 2022/1/13 21:13
 * @Description 自己类
 **/
    public class My extends Handler {

    public My(boolean isBusy){
        setBusy(isBusy);
    }

    @Override
    public void handerRequest() {
        if(this.isBusy()){
            setSuccessor(successor);
        }else {
            System.out.println("我:正是订饭高峰期,那我自己做饭吧");
        }
    }
}
/**
 * @Date 2022/1/13 20:48
 * @Description 奶奶类
 **/
public class Grandmather extends Handler {
    public Grandmather(boolean isBusy){
        setBusy(isBusy);
    }

    @Override
    public void handerRequest() {
        if(isBusy()){
            System.out.println("奶奶:我没空,你自己订外卖吧");
            setSuccessor(successor);
        }else{
            System.out.println("行,奶奶给你做饭");
            successor.setBusy(false);
        }
    }
}
/**
 * @Date 2022/1/13 20:48
 * @Description 爷爷类
 **/
public class Grandfather extends Handler{

    public Grandfather(boolean isBusy){
        setBusy(isBusy);
    }

    @Override
    public void handerRequest() {
        if(isBusy()){
            System.out.println("爷爷:我没空找你奶奶");
            setSuccessor(successor);
        }else{
            System.out.println("行,爷爷给你做饭");
            successor.setBusy(false);
        }
    }
}
/**
 * @Date 2022/1/13 20:47
 * @Description 爸爸类
 **/
public class Father extends Handler {

    public Father(boolean isBusy){
        setBusy(isBusy);
    }

    @Override
    public void handerRequest() {
        if(isBusy()){
            System.out.println("爸:我没空找你爷爷");
            setSuccessor(successor);
        }else{
            System.out.println("行,爸给你做饭");
            successor.setBusy(false);
        }
    }
}
/**
 * @Date 2022/1/13 20:47
 * @Description 妈妈类
 **/
public class Mather extends Handler {

    public Mather(boolean isBusy){
        setBusy(isBusy);
    }

    @Override
    public void handerRequest() {
        if(isBusy()){
            System.out.println("妈:我没空找你爸");
            setSuccessor(successor);
        }else{
            System.out.println("行,妈给你做饭");
            successor.setBusy(false);
        }
    }
}

main方法 

/**
 * @Date 2022/1/13 20:44
 * @Description 责任链模式的例子,内容:
 * 我饿了,
 * 先找妈妈做饭,
 *      如果妈妈有时间,她给我做饭。
 * 如果妈妈没有时间,让我找爸爸做饭。
 *      如果爸爸有时间,他给我做饭。
 * 如果爸爸没有时间,让我找爷爷做饭。
 *      如果爷爷有时间,他给我做饭。
 * 如果爷爷没有时间,让我找奶奶做饭。
 *      如果奶奶有时间,他给我做饭。
 * 如果奶奶没有时间,让我找自己定外卖。
 *      如果正是午饭时期,订单排队人数较多。
 * 那我自己做饭。
 **/
public class Domain {
    private final static String content = "我饿了";
    public static void main(String[] args) {
        condition2();
    }

    private static void condition2() {
        List<Handler> handlers = getHandlers();
        for (Handler handler : handlers) {
            handler.handerRequest();
            if(!handler.isBusy()){
                break;
            }
        }
    }

    private static List<Handler> getHandlers() {
        List<Handler> handlers = new LinkedList<>();

        Mather mather = new Mather(true);

        Father father = new Father(true);

        Grandfather grandfather = new Grandfather(true);

        Grandmather grandmather = new Grandmather(true);

        Waimai waimai = new Waimai(true);

        My my = new My(false);


        mather.setSuccessor(father);
        father.setSuccessor(grandfather);
        grandfather.setSuccessor(grandmather);
        grandmather.setSuccessor(my);
        my.setSuccessor(waimai);
        waimai.setSuccessor(my);

        handlers.add(mather);
        handlers.add(father);
        handlers.add(grandfather);
        handlers.add(grandmather);
        handlers.add(waimai);
        handlers.add(my);

        return handlers;
    }
}

以下为输出的结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值