设计模式--责任链

 

1. 责任链定义:

1.1. 官方定义

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任

1.2. 白话定义:

当我们在执行一串相关联且有顺序的时候,可以使用责任链。

例一:打游戏,攻打第三关时需要把第一关和第二关通关才可以打第三关且必须第一关和第二关都得通关,那么这种场景我们就可以使用责任链。

例二:网关拦截,当客户端请求后端时,我们对请求要做网关限流判断、黑名单拦截判断、用户会话拦截判断,只有全都都通过才可以访问目标方法,该种场景也可以使用责任链模式。以下以网关拦截为例:

2. 模板代码

2.1. 网关流程抽象模板GatewayHandler

/**
 *  @author: cyb
 *  @Date: 2020-10-09 22:53
 *  @Description:定义一个链状抽象的操作方法
 */
public abstract class GatewayHandler {

    protected GatewayHandler nextGatewayHandler;

    /**
     * 定义一个抽象处理业务逻辑方法
     *
     */
    public abstract void service();

    /***
     * 设置链状的行为,即下一个操作的对象类
     * @param gatewayHandler
     */
    public void setHandler(GatewayHandler gatewayHandler) {
        this.nextGatewayHandler = gatewayHandler;
    }

    /***
     * 调用下一个操作对象类中的抽象实现方法
     */
    protected void nextService(){
        if(nextGatewayHandler!=null){
            nextGatewayHandler.service();;
        }
    }
}

2.2. 第一关CurrentLimitHandler

import org.springframework.stereotype.Component;

/**
 *  @author: cyb
 *  @Date: 2020-10-09 22:56
 *  @Description:设置第一关执行方法,并在方法中调用下一个链状对象中指定的方法,从而实现链状事务的实现
 */
@Component
public class CurrentLimitHandler extends GatewayHandler  {
    public void service() {
        System.out.println("第一关网关限流判断....");
        nextService();
    }
}

2.3. 第二关BlacklistHandler

import org.springframework.stereotype.Component;

/**
 *  @author: cyb
 *  @Date: 2020-10-09 22:55
 *  @Description:设置第二关
 */
@Component
public class BlacklistHandler extends GatewayHandler {
    @Override
    public void service() {
        System.out.println("第二关黑名单拦截判断....");
        nextService();
    }
}

2.4. 第三关ConversationHandler

import org.springframework.stereotype.Component;

/**
 *  @author: cyb
 *  @Date: 2020-10-09 22:55
 *  @Description:设置第三关
 */
@Component
public class ConversationHandler extends GatewayHandler {
    @Override
    public void service() {
        System.out.println("第三关用户会话拦截判断....");
        nextService();
    }
}

2.5. 设置顺序及测试代码FactoryHandler

public class FactoryHandler {
    /**
     * 设置事务链,即行为的执行顺序
     * @return
     */
    public static GatewayHandler getGatewayHandler() {
        //第一关
        GatewayHandler gatewayHandler1 = new CurrentLimitHandler();
        //第二关
        GatewayHandler gatewayHandler2 = new BlacklistHandler();
        gatewayHandler1.setHandler(gatewayHandler2);
        //第三关
        GatewayHandler gatewayHandler3 = new ConversationHandler();
        gatewayHandler2.setHandler(gatewayHandler3);
        return gatewayHandler1;
    }

    public static void main(String[] args) {
        GatewayHandler gatewayHandler1=  FactoryHandler.getGatewayHandler();
        gatewayHandler1.service();
   }
}

 3. 效果:

 

以上内容为本篇博客内容,如若对以上内容有所疑问的欢迎留言交流探讨。转发请说明出处,本人博客地址:https://www.cnblogs.com/chenyuanbo/

 

posted @ 2020-10-10 00:33  陈远波  阅读(149)  评论(0编辑  收藏  举报