背景
每当想起去书店买书,老是觉得老火,为啥同样一本书,卖我总是比别人贵呢?我买就只打8折为啥其他有7折的???人品问题???不是的,是因为会员制度,不同的会员等级享受不同的折扣,这个很类似我们的策略模式,不同的角色可以定义不同的算法。
策略模式是什么?
策略模式(Strategy Pattern),属于行为模式,定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
角色:
抽象策略角色(Stractegy):主要定义抽象接口
具体策略角色(ConcreteStrategy):负责具体策略实现
上下文:负责根据不同的用户信息调用不同策略
用户:具体请求的用户
策略模式可以干嘛?
策略模式主要解决一个问题,通过请求的对象,自身的信息进行决策匹配合适的算法进行业务逻辑的实现。
优点:
易扩展性:可以很方便添加策略,并且遵循开闭原则,对原来的策略不会造成任何影响;
策略类之间可以自由切换;
缺点:
上层模块必须知道所有的策略
过我的策略会导致类型非常庞大
个人理解:
策略模式好比你去超市买东西,同一样东西,不同的会员价格不一样的,有的打5折,有的打3折,有的打骨折。
策略模式类图
实现代码
/**
* @Auther: csh
* @Date: 2020/6/17 15:22
* @Description:抽象策略
*/
public interface Strategy {
//打折接口
Double doOperation(int price);
}
/**
* @Auther: csh
* @Date: 2020/6/17 15:25
* @Description:普通会员(ConcreteStrategy)
*/
public class CommonMember implements Strategy {
@Override
public Double doOperation(int price) {
return (price*0.8);
}
}
/**
* @Auther: csh
* @Date: 2020/6/17 15:52
* @Description:VIP会员(ConcreteStrategy)
*/
public class VipMember implements Strategy {
@Override
public Double doOperation(int price) {
return price*0.5;
}
}
/**
* @Auther: csh
* @Date: 2020/6/17 15:53
* @Description:黄金会员(ConcreteStrategy)
*/
public class GoldMember implements Strategy {
@Override
public Double doOperation(int price) {
return price*0.3;
}
}
/**
* @Auther: csh
* @Date: 2020/6/17 15:54
* @Description:上下文
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public Double executeStrategy(int price){
return strategy.doOperation(price);
}
}
/**
* @Auther: csh
* @Date: 2020/6/17 16:13
* @Description:策略模式
*/
public class Client {
public static void main(String[] args) {
Context context = new Context(new CommonMember());
System.out.println("普通会员价格:"+context.executeStrategy(100));
context = new Context(new VipMember());
System.out.println("Vip会员价格:"+context.executeStrategy(100));
context = new Context(new GoldMember());
System.out.println("黄金会员价格:"+context.executeStrategy(100));
}
}
结果
普通会员价格:80.0
Vip会员价格:50.0
黄金会员价格:30.0
策略的一些开源码:
jdk策略
在spring中实现的策略模式实现:
抽象接口
实现
最后
策略模式在实现的研发过程中,真的很得非常普遍,比如订单价格计算,会员卡、活动等等无处不在的影子,而且实用性非常强,但是策略模式也有缺点就是一但策略类超过3个以上维护起来就不是很方便了,所以会加上其他模式组合使用比如策略+工厂。