您现在的位置是:首页 >技术交流 >策略模式——实践:在业务逻辑中理解设计模式网站首页技术交流
策略模式——实践:在业务逻辑中理解设计模式
简介策略模式——实践:在业务逻辑中理解设计模式
一般定义
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
主要角色
Context: 环境类
Strategy: 抽象策略类
ConcreteStrategy: 具体策略类
结合场景理解
一般来说,我们的controller层只做业务的编排,不进行业务逻辑的处理,也就是说不希望有很多if else这样的分支。
比如,对于广告投放系统,我们的代码中有一套一般流程的投放逻辑,但是我们总会有一些大客户,他们希望定制一些个性化的投放功能。
在不使用策略模式之前,对于亚马逊或者京东等需要定制化的大客户,我们可能的做法是在controller层根据厂商标识mark(比如京东为JD,亚马逊为YM)走不同的逻辑,这样其实是不好的,这会使得算法和业务耦合。
这个时候,可以考虑将if else这些逻辑从controller层抽掉,controller层只处理请求,也就是来的mark不管是什么,我们都同样处理,而不需要在controller层进行判断,把判断的逻辑隐藏在后面,这就是策略模式。
代码
/**
* 根据不同mark进行不同逻辑(策略)来投放
*
*/
class StrategyTest {
/**
* controller层
*/
@Test
void strategy() {
StrategyContext strategyContext = new StrategyContext();
// 假设来的是京东
AdvertiseStrategy strategy = strategyContext.getStrategy("京东");
String s = strategy.Advertise();
System.out.println(s);
}
/**
* 策略接口
*/
public interface AdvertiseStrategy {
/**
* 广告投放
* @return
*/
String Advertise();
}
/**
* 默认策略
*/
@Component
class DefaultStrategy implements AdvertiseStrategy {
@Override
public String Advertise() {
return "默认——广告投放完成";
}
}
/**
* 京东策略
*/
@Component
class JDStrategy implements AdvertiseStrategy {
@Override
public String Advertise() {
return "京东——广告投放完成";
}
}
/**
* 亚马逊策略
*/
@Component
class YMXStrategy implements AdvertiseStrategy {
@Override
public String Advertise() {
return "亚马逊——广告投放完成";
}
}
/**
* 策略上下文 、 策略选择器
* 在这里根据不同策略进行选择
*/
@Component
class StrategyContext {
private Map<String, AdvertiseStrategy> strategyMap = new HashMap<>();
public StrategyContext() {
strategyMap.put("京东", new JDStrategy());
strategyMap.put("亚马逊", new YMXStrategy());
strategyMap.put("默认", new DefaultStrategy());
}
// 策略选择
public AdvertiseStrategy getStrategy(String Mark) {
AdvertiseStrategy AdvertiseStrategy = strategyMap.get(Mark);
if (AdvertiseStrategy != null) {
return strategyMap.get(Mark);
}
// 返回默认的策略
return new DefaultStrategy();
}
}
}
测试结果
京东——广告投放完成
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。