今天在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中都有其应用,各位感兴趣的小伙伴的小伙伴的可以去读读,或者找找看还有别的地方在用没有。
如果有错的话还请大佬指教,谢谢