策略模式
- 简介:策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。
- 核心角色:
- 环境(Context):维护一个对策略对象的引用,负责将客户端请求委派给具体的策略对象执行。环境类可以通过依赖注入、简单工厂等方式来获取具体策略对象。
- 抽象策略(Abstract Strategy):定义了策略对象的公共接口或抽象类,规定了具体策略类必须实现的方法。
- 具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。
- 案例:
假设有个需求,我需要根据传参更新数据库中status状态值,可能会更新组件(conponent)表中的status值,也有可能更新License表中的status值,可以用策略模式来实现。
package com.dhr.study.design.strategy;
public interface StatusStrategy {
void updateStatus(Integer status);
}
package com.dhr.study.design.strategy;
public class ComponentStrategy implements StatusStrategy {
@Override
public void updateStatus(Integer status) {
System.out.println("更新组件状态:status:" + status);
}
}
package com.dhr.study.design.strategy;
public class LicenseStrategy implements StatusStrategy {
@Override
public void updateStatus(Integer status) {
System.out.println("更新license状态:status:" + status);
}
}
package com.dhr.study.design.strategy;
public class StrategyContext {
public StatusStrategy strategy;
public StrategyContext(StatusStrategy strategy) {
this.strategy = strategy;
}
public void executeStrategy(Integer status) {
strategy.updateStatus(status);
}
}
package com.dhr.study.design.strategy;
public class TestStrategy {
public static void main(String[] args) {
StrategyContext context = new StrategyContext(new ComponentStrategy());
context.executeStrategy(1);
StrategyContext context2 = new StrategyContext(new LicenseStrategy());
context2.executeStrategy(0);
}
}