注解实现策略模式

注解实现策略模式

        • [1. 使用idea创建sprignboot项目](#1. 使用idea创建sprignboot项目)
        • [2. 创建策略接口](#2. 创建策略接口)
        • [3. 创建策略类型注解](#3. 创建策略类型注解)
        • [4. 创建两个具体策略类](#4. 创建两个具体策略类)
        • [5. 策略工厂类](#5. 策略工厂类)
        • [6. 使用](#6. 使用)
1. 使用idea创建sprignboot项目
2. 创建策略接口
java 复制代码
public interface Handler {

    Double callPrice(Double price);

}
3. 创建策略类型注解
java 复制代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface HandlerType {

    String type();
}
4. 创建两个具体策略类
java 复制代码
@HandlerType(type = "vip")
@Service
public class VipHandler implements Handler{
    @Override
    public Double callPrice(Double price) {
        return price*0.8;
    }
}
java 复制代码
@HandlerType(type="member")
@Service
public class MemberHandler implements Handler{
    @Override
    public Double callPrice(Double price) {
        return price;
    }
}
5. 策略工厂类
java 复制代码
@Component
public class HandlerFactory implements BeanFactoryPostProcessor {

    private static Map<String,Handler> handlerMap = new ConcurrentHashMap<>();
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        Map<String, Object> handlerBeans = beanFactory.getBeansWithAnnotation(HandlerType.class);
        Optional.ofNullable(handlerBeans).orElse(Collections.emptyMap())
                .forEach((name,bean) -> {
                    Class<?> clazz = bean.getClass();
                    HandlerType handlerType = clazz.getAnnotation(HandlerType.class);
                    handlerMap.put(handlerType.type(), (Handler) bean);
                });

    }

    public static Handler getHandler(String type){
        Handler handler = handlerMap.get(type);
        if (handler == null) {
            throw new RuntimeException("can not find handler");
        }
        return handler;
    }
}
6. 使用
java 复制代码
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
        Handler vip = HandlerFactory.getHandler("vip");
        System.out.println(vip.callPrice(1000.0));
    }

}
相关推荐
折哥的程序人生 · 物流技术专研8 小时前
第4篇:Lambda 简化策略模式(Java 8+)
java·设计模式·策略模式·函数式编程·lambda·代码简化·扩充系列
在水一缸1 天前
拒绝被打扰:深度解析 macOS 进程守护与“反自动启动”攻防战
macos·策略模式·用户体验·进程守护·自动启动·系统权限
折哥的程序人生 · 物流技术专研2 天前
第3篇:手写促销策略引擎(满减、打折、立减)
java·设计模式·策略模式·开闭原则·编程实战·扩充系列·促销引擎
杨运交2 天前
[045][Crypto模块]设计一个可扩展的加解密框架:策略模式与工厂模式实战
linux·运维·策略模式
IT·陈寒2 天前
macOS 安装 Claude Code 全流程
人工智能·macos·策略模式
折哥的程序人生 · 物流技术专研2 天前
第4篇:模板方法 vs 策略模式,面试怎么选?
java·设计模式·策略模式·行为型模式·模版方法模式·扩充系列·继承v组合
折哥的程序人生 · 物流技术专研3 天前
第2篇:策略模式三大角色拆解与UML
java·设计模式·策略模式·uml·编程入门·行为型模式·扩充系列
XX風3 天前
VTK 策略模式详解:InteractorStyle、Mapper、Picker 与可替换算法
图形渲染·策略模式
大侠锅锅5 天前
第 4 篇:策略模式实践——用统一接口管理 Docker 容器、原生进程与 K3s Pod
docker·容器·边缘计算·策略模式·iot
智慧城市20306 天前
183页PPT,麦肯锡战略屋品牌屋营销模型:打通战略、品牌与供应链的落地闭环
策略模式·战略咨询·流程管理