设计模式--策略模式概念要点及例子说明
Posted 做猪呢,最重要的是开森啦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--策略模式概念要点及例子说明相关的知识,希望对你有一定的参考价值。
0. 定义:
- 策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和实际算法分割开来。
0.1. 策略模式主要角色:
- 抽象策略(Strategy)类:定义了一个公共接口,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
- 策略模式实现就是将一组算法封装到一个策略类里,根据些算法特性(如beanName)来获取对应算法来调用
- 下面的栗子把对象都交给Spring去管理
1. 举个栗子:
1.1. 抽象策略类:
/**
* 抽象策略类
*/
@Component
public interface Strategy
// 策略方法
void strategyMethod();
1.2. 具体策略类:
/**
* 策略类A
*/
@Component
public class ConcreteStrategyA implements Strategy
@Override
public void strategyMethod()
System.out.println("具体策略A的策略方法被访问");
/**
* 策略类B
*/
@Component
public class ConcreteStrategyB implements Strategy
@Override
public void strategyMethod()
System.out.println("具体策略B的策略方法被访问!");
1.3. 环境类:
@Component
public class StrategyFactory
@Autowired
private final Map<String, Strategy> strategyMap = new HashMap<>();
public Strategy getStrategy(String strategyName)
Strategy strategy = strategyMap.get(strategyName);
return strategy;
public static void main(String[] args)
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
StrategyFactory strategyFactory = annotationConfigApplicationContext.getBean(StrategyFactory.class);
Strategy strategy = strategyFactory.getStrategy("concreteStrategyB");
strategy.strategyMethod();
@Configuration
@ComponentScan(value = "com.zwh.strategy")
public class AppConfig
- 这里通过main方法来调用环境类,实际应用可以实注入来调用
- 自动注入的时候可以将Strategy注入到Map里,key为beanName
- 默认通过beanName来获取对应策略算法,然后执行策略方法(spring默认beanName为类名首字母小写,你也可以指定特定name)
上述main方法执行输出:具体策略B的策略方法被访问!
【题外】:
- 策略模式一定程度上可以提代if… esle… 多重条件处理,如上述普通的条件分支实现如下,显然条件多了就不太优雅~
if ("concreteStrategyA".equals(beanName))
new ConcreteStrategyA().strategyMethod();
else if ("concreteStrategyB".equals(beanName))
new ConcreteStrategyB().strategyMethod();
else
【参考】:
策略模式在Spring中的应用
以上是关于设计模式--策略模式概念要点及例子说明的主要内容,如果未能解决你的问题,请参考以下文章