注解实现策略模式

注解实现策略模式

        • [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));
    }

}
相关推荐
“抚琴”的人1 小时前
C#上位机策略模式
开发语言·c#·策略模式
梦里小白龙13 小时前
JAVA 策略模式+工厂模式
java·开发语言·策略模式
秋邱2 天前
Java面向对象进阶实战:用工厂模式+策略模式优化支付系统
java·bash·策略模式
吃喝不愁霸王餐APP开发者4 天前
基于策略模式动态选择不同地区霸王餐API接口的路由实现
策略模式
未来之窗软件服务4 天前
幽冥大陆(六十三) roff 语言:核心用途与使用指南—东方仙盟筑基期
策略模式·东方仙盟·roff
老朱佩琪!4 天前
Unity策略模式
unity·设计模式·策略模式
山沐与山5 天前
【设计模式】Python策略模式:从入门到实战
python·设计模式·策略模式
多看书少吃饭8 天前
Electron 桌面应用打开录音功能导致页面蓝屏问题解决方案
javascript·electron·策略模式
大海星辰7989 天前
工厂模式与策略模式的深度实践:从代码优化到架构思考
java·架构·策略模式
天勤量化大唯粉9 天前
基于距离的配对交易策略:捕捉价差异常偏离的均值回归机会(天勤量化代码实现)
android·开发语言·python·算法·kotlin·开源软件·策略模式