您当前的位置: 首页 >  spring

星夜孤帆

暂无认证

  • 5浏览

    0关注

    626博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

策略模式在Spring中的应用

星夜孤帆 发布时间:2021-05-25 20:04:58 ,浏览量:5

Spring相关配置
@Configuration
@ComponentScan(value = "com.best")
public class AppConfig {
    
}

 不打印debug日志,logback-test.xml



    
    
1.定义策略接口
// 抽象策略类
@Component
public interface Strategy {

    // 策略方法
    void strategyMethod();

    String getStrategyName();

     default boolean support() {
        return true;
     }
}
2.定义两个实现类,策略A和策略B
// 具体策略类A
@Component
public class ConcreteStrategyA implements Strategy{
    @Override
    public void strategyMethod() {
        System.out.println("具体策略A的策略方法被访问");
    }

    @Override
    public String getStrategyName() {
        return "A";
    }

    @Override
    public boolean support() {
        return true;
    }

}
// 具体策略类B
@Component
public class ConcreteStrategyB implements Strategy {

    @Override
    public void strategyMethod() {
        System.out.println("具体策略B的策略方法被访问!");
    }

    @Override
    public String getStrategyName() {
        return "B";
    }
}
3.定义环境类
@Component
public class Context {

    @Autowired
    private StrategyFactory strategyFactory;

     public void strategyMethod(String strategyName) {
         Strategy strategy = strategyFactory.getStrategy(strategyName);
         strategy.strategyMethod();
     }

}
4.定义策略工厂
@Component
public class StrategyFactory implements InitializingBean {

    @Autowired
    private ApplicationContext applicationContext;

    /**
     * K-策略枚举,V-对应的SpringBean
     */
    private final Map strategyMap = new HashMap();

    public Strategy getStrategy(String strategyName)  {
        Strategy strategy = strategyMap.get(strategyName);
        return strategy;
    }

    @Override
    public void afterPropertiesSet() {
        Map beanMap = applicationContext.getBeansOfType(Strategy.class);
        beanMap.forEach((beanName, strategy) -> {
            System.out.println(beanName + ", " + strategy);
            strategyMap.put(strategy.getStrategyName(), strategy);
        });
        System.out.println(beanMap);
    }
}
5.定义测试类
public class Test {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        System.out.println(annotationConfigApplicationContext.getBean("concreteStrategyA").getClass().getName());
        System.out.println(annotationConfigApplicationContext.getBean("concreteStrategyB").getClass().getName());
        Context context = annotationConfigApplicationContext.getBean(Context.class);
        // 两种策略:A和B
        context.strategyMethod("B");
    }
}

参考博客

关注
打赏
1636984416
查看更多评论
立即登录/注册

微信扫码登录

0.0804s