设计模式之责任链模式

今天在MOOC网看了些大佬讲责任链模式,所以打算自己动手实践下,并将其记录

其实直白的说就是当这个各个任务向一串链条的循序执行,我们直接

上代码吧

package com.example.demo.responsibilityChain;

public abstract class EasyChain {
    private EasyChain successor;

    public EasyChain getSuccessor() {
        return successor;
    }

    public void setSuccessor(EasyChain successor) {
        this.successor = successor;
    }

    public void execute(){
        handChain();
        if (successor != null) successor.execute();
    }
    protected abstract void handChain();
}

让我们来看下实现类

 

package com.example.demo.responsibilityChain;

public class EasyChainA extends EasyChain{
    @Override
    protected void handChain() {
        System.out.println(" process a in Chain node a");
    }
}
package com.example.demo.responsibilityChain;

public class EasyChainB extends EasyChain{
    @Override
    protected void handChain() {
        System.out.println(" process b in Chain node b");
    }
}
package com.example.demo.responsibilityChain;

public class EasyChainC extends EasyChain{
    @Override
    protected void handChain() {
        System.out.println(" process c in Chain node c");
    }
}

测试类

package com.example.demo;


import com.example.demo.responsibilityChain.EasyChain;
import com.example.demo.responsibilityChain.EasyChainA;
import com.example.demo.responsibilityChain.EasyChainB;
import com.example.demo.responsibilityChain.EasyChainC;

public class DemoApplication {

    public static void main(String[] args) {
        EasyChain chainA = new EasyChainA();
        EasyChain chainB = new EasyChainB();
        EasyChain chainC = new EasyChainC();
        chainA.setSuccessor(chainB);
        chainB.setSuccessor(chainC);
        chainA.execute();
    }
}

结果

虽然我们正确的链式的执行了,但是我们是写得很死很low,所以我们来写灵活点

Chain2.0开始

package com.example.demo.responsibilityChain;

import java.util.List;

public class Chain {
    private List<ChainHandler> chainHandlers; //所有的task

    private int index = 0; //游标

    public Chain(List<ChainHandler> chainHandlers) {
        this.chainHandlers = chainHandlers;
    }
    public void proceed(){
        if (index >= chainHandlers.size()){
            return;
        }
        chainHandlers.get(index++).execute(this);//每次调用一个chainhandler,并且游标加一
    }
}
package com.example.demo.responsibilityChain;

public abstract class ChainHandler {
    public void execute(Chain chain){
        handleProcess(); //实际调用执行的地方
        chain.proceed(); //执行下一个
    }
    protected abstract void handleProcess();
}

client类

package com.example.demo.responsibilityChain;

public class Client {
    public static class ChainHandlerA extends ChainHandler{

        @Override
        protected void handleProcess() {
            System.out.println("chain handler a proceed");
        }
    }
    public static class ChainHandlerB extends ChainHandler{

        @Override
        protected void handleProcess() {
            System.out.println("chain handler b proceed");
        }
    }
    public static class ChainHandlerC extends ChainHandler{

        @Override
        protected void handleProcess() {
            System.out.println("chain handler c proceed");
        }
    }
}

测试类

package com.example.demo;


import com.example.demo.responsibilityChain.Chain;
import com.example.demo.responsibilityChain.ChainHandler;
import com.example.demo.responsibilityChain.Client;

import java.util.ArrayList;
import java.util.List;

public class DemoApplication {

    public static void main(String[] args) {
        List<ChainHandler> chainHandlers = new ArrayList<>();
        chainHandlers.add(new Client.ChainHandlerA());
        chainHandlers.add(new Client.ChainHandlerB());
        chainHandlers.add(new Client.ChainHandlerC());
        Chain chain = new Chain(chainHandlers);
        chain.proceed();
    }
}

结果

好了,一个简单的demo我们就写完了,现在让我们来看看springmvc框架里的使用:

 我们可以看到在springmvc 框架中的HandlerExecutionChain和spring框架中的ReflectiveMethodInvocation.java中都有其应用,各位感兴趣的小伙伴的小伙伴的可以去读读,或者找找看还有别的地方在用没有。

如果有错的话还请大佬指教,谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值