策略模式解决多品牌逻辑

0. 自定义注解 标记处理器

@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface DomainHandler {

    String value() default "";
}

1. 工厂接口

public interface IDomainHandlerFactory {

	/**
	 *
	 * @return
	 */
	public Map<String, IDoorHandler> getDomainHandlers();

	public void setSocketHandlers(Map<String, IDoorHandler> domainHandlers);
	
	/**
	 * 获取平台对应业务模型handler
	 * @param platform
	 * @return
	 */
	public IDoorHandler getDomainHandler(String platform);

}

2. 工厂实现

@Component
public class DomainHandlerFactory implements IDomainHandlerFactory {

    private Map<String, IDoorHandler> domainHandlers = Maps.newHashMap();

    @Override
    public Map<String, IDoorHandler> getDomainHandlers() {
        return domainHandlers;
    }

    @Override
    public void setSocketHandlers(Map<String, IDoorHandler> domainHandlers) {
        this.domainHandlers = domainHandlers;
    }

    @Override
    public IDoorHandler getDomainHandler(String domainHandlerName) {
        return domainHandlers.getOrDefault(domainHandlerName, null);
    }

    /**
     * 注入spring上下文
     *
     * @param springContextUtil
     */
    @Resource(name = "springContextUtil")
    private void setSpringContextUtil(SpringContextUtil springContextUtil) {
        this.loadHandlerFromSpringBeans(springContextUtil);
    }

    /**
     * 初始化handler
     *
     * @param springContextUtil
     */
    private void loadHandlerFromSpringBeans(SpringContextUtil springContextUtil) {
        ApplicationContext applicationContext = springContextUtil.getApplicationContext();
        String[] names = applicationContext.getBeanDefinitionNames();
        Class<?> type;
        for (String name : names) {
            //获取到类对象
            type = applicationContext.getType(name);
            DomainHandler domainHandler = type.getDeclaredAnnotation(DomainHandler.class);
            if (domainHandler != null && StringUtils.isNotEmpty(domainHandler.value())) {
                try {
                    IDoorHandler handler = (IDoorHandler) applicationContext.getBean(name);
                    domainHandlers.put(domainHandler.value(), handler);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

3. SpringContextUtil 注入到spring上下文

public class SpringContextUtil implements ApplicationContextAware {
    public static ApplicationContext applicationContext;

    public SpringContextUtil() {
    }

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public <T> T getBean(String name) throws BeansException {
        return applicationContext.getBean(name);
    }

    public static ApplicationContext getContext() {
        return applicationContext;
    }

    public static Object getContextBean(String name) {
        return applicationContext.getBean(name);
    }
}

4. 门禁domain

public interface IDoorDomain {

    /**
     * 人员下发
     *
     * @param userAddDownRecord 参数
     * @return 结果
     */
    RestResult<String> addUserDown(UserAddDownRecord userAddDownRecord);

}

5. domain实现

@Slf4j
@Component
public class DoorDomainImpl implements IDoorDomain{

    private final static String domainHandlerBegin = "DOMAIN-DOOR-";

    @Autowired
    private IDomainHandlerFactory domainHandlerFactory;

    @Override
    public RestResult<String> addUserDown(UserAddDownRecord userAddDownRecord) {
        return ((IDoorHandler) domainHandlerFactory.getDomainHandler(domainHandlerBegin+"DAHUA_GATEWAY")).addUserDown(userAddDownRecord);
    }
}

6. handler 接口

public interface IDoorHandler {

    /**
     * 新增人员
     *
     * @param userAddDownRecord
     * @return 结果
     */
    RestResult<String> addUserDown(UserAddDownRecord userAddDownRecord);

}

7. 处理handler 多品牌

@DomainHandler("DOMAIN-DOOR-DAHUA_GATEWAY")
@Component
@Slf4j
public class DoorDaHuaGatewayHandler implements IDoorHandler {

    @Override
    public RestResult<String> addUserDown(UserAddDownRecord userAddDownRecord) {
        log.info("DAHUA_GATEWAY_userAddDownRecord:{}", JSON.toJSONString(userAddDownRecord));
        return RestResult.wrapSuccessResponse(userAddDownRecord.getApiUserId());
    }

}

8. 方法调用

    @Autowired
    private IDoorDomain iDoorDomain;

     return iDoorDomain.addUserDown(record);

ps.策略模式 简单实现

 if (eventType != null) {
     Map<String, Function<String, String>> actionMappings = new HashMap<>();
     actionMappings.put("door", (e) -> "daHuaIccCallBack/doorPush");
     actionMappings.put("gate", (e) -> "daHuaIccCallBack/gatePush");
     actionMappings.put("event", (e) -> "daHuaIccCallBack/eventBusinessPush");
     return prefix + actionMappings.get(eventType).apply(eventType);
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值