Springboot使用策略模式+工廠模式代替大量if-else


一.實戰需求:redis-key過期監聽

二.問題:大量key會造成監聽代碼臃腫

三.解決方案:使用策略模式+工廠模式代替if-else

 

代碼:

第一部分:redis-springboot配置

package com.htjx.common.redismonitor;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.Topic;

/**
 * 功能描述: <br> rediskey監聽
 * @Author: zhang
 * @Date: 2021/9/7 15:39
 */
@Configuration
public class RedisListenerConfig {
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Autowired
    private RedisListenerHandel keyExpiredListener;
    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
        redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
        // 配置監聽器監聽的主題關聯
        Topic topic = new ChannelTopic("__keyevent@0__:expired");
        redisMessageListenerContainer.addMessageListener(keyExpiredListener, topic);
        Topic topic2 = new ChannelTopic("__keyevent@1__:expired");
        redisMessageListenerContainer.addMessageListener(keyExpiredListener, topic2);
        return redisMessageListenerContainer;
    }

}

 

第二部分:監聽處理器

package com.htjx.common.redismonitor;


import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;

/**
 * 功能描述: <br> key過期監聽處理器
 * @Author: zhang
 * @Date: 2021/9/7 17:57
 */
@Component
public class RedisListenerHandel implements  MessageListener {

private static String SUFFIX="expire:";

    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.err.println(message.toString());
        // 用戶做自己的業務處理即可,注意message.toString()可以獲取失效的key
        String expiredKey = message.toString();
       String key= expiredKey.split(SUFFIX)[0]+SUFFIX;
        System.err.println(key);
        RedisListenerFactory.get(key).execute(expiredKey);
    }
}

 

第三部分:策略接口

package com.htjx.common.redismonitor;

public interface RedisListenerStrategy {
    void execute(String keyInfo);
}

 

第四部分:工廠類

package com.htjx.common.redismonitor;

import java.util.HashMap;

public class RedisListenerFactory {

    private static HashMap<String,RedisListenerStrategy> objMap=new HashMap<>();

    private RedisListenerFactory(){

    }
    public static void put(String key,RedisListenerStrategy redisListenerStrategy){
        objMap.put(key,redisListenerStrategy);
    }


    public static RedisListenerStrategy get(String key){
        RedisListenerStrategy educationalBackground = objMap.get(key);
        return educationalBackground;
    }


}

 

第五部分:任務處理類

package com.htjx.common.redismonitor.redisTask;

import com.htjx.common.enums.RedisKeyPrefix;
import com.htjx.common.redismonitor.RedisListenerFactory;
import com.htjx.common.redismonitor.RedisListenerStrategy;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * 功能描述: <br> 設備手動啟停
 * @Author: zhang
 * @Date: 2021/9/7 16:45
 */
@Component
public class DeviceSecRuningSwitch implements InitializingBean , RedisListenerStrategy {

    /**
     * 功能描述: <br> bean初始化完成后的操作
     * @Author: zhang
     * @Date:  17:58
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        RedisListenerFactory.put(RedisKeyPrefix.設備自動開機.getKey(),this);
    }

    /**
     * 功能描述: <br> 執行的動作
     * @Author: zhang
     * @Date: 2021/9/7 17:58
     */
    @Override
    public void execute(String keyInfo) {
        System.err.println("key信息:"+keyInfo);
        System.err.println("檢測到設備需要關機了");
    }


}

 

package com.htjx.common.redismonitor.redisTask;

import com.htjx.common.enums.RedisKeyPrefix;
import com.htjx.common.redismonitor.RedisListenerFactory;
import com.htjx.common.redismonitor.RedisListenerStrategy;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * 功能描述: <br> 設備手動啟停
 * @Author: zhang
 * @Date: 2021/9/7 16:45
 */
@Component
public class DeviceSecRuningSwitch2 implements InitializingBean , RedisListenerStrategy {

    /**
     * 功能描述: <br> bean初始化完成后的操作
     * @Author: zhang
     * @Date:  17:58
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        RedisListenerFactory.put(RedisKeyPrefix.設備自動關機.getKey(),this);
    }

    /**
     * 功能描述: <br> 執行的動作
     * @Author: zhang
     * @Date: 2021/9/7 17:58
     */
    @Override
    public void execute(String keyInfo) {
        System.err.println("key信息:"+keyInfo);
        System.err.println("檢測到設備需要開機了");
    }


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM