1158 字
约 3 分钟
2
策略模式解决的是:同一个事情,有很多种做法,运行时根据情况选择一种做法
策略模式解决的是:同一个事情,有很多种做法,运行时根据情况选择一种做法。
关键词:
同一个行为,不同实现。
1. 现实例子:付款方式
假设现在有一个订单系统。
用户付款:
支付订单
但是支付方式不同:
支付宝支付
微信支付
银行卡支付
一开始代码可能这样写:
public void pay(String type,double money){
if(type.equals("alipay")){
System.out.println("支付宝支付");
}else if(type.equals("wechat")){
System.out.println("微信支付");
}else if(type.equals("bank")){
System.out.println("银行卡支付");
}
}
刚开始没问题。
但是后来:
增加:
Apple Pay
PayPal
数字人民币
京东支付
你的代码变成:
if(){
}else if(){
}else if(){
}else if(){
}else if(){
}
这就是问题。
2. 为什么这个问题适合策略模式?
因为这些代码虽然不同:
支付宝支付
微信支付
银行卡支付
但是它们本质都是:
支付
也就是说:
行为相同,实现不同。
所以抽象一个策略接口:
interface PayStrategy {
void pay(double money);
}
然后每种方式一个策略:
支付宝:
class AliPayStrategy implements PayStrategy{
public void pay(double money){
System.out.println(
"支付宝支付:"+money
);
}
}
微信:
class WechatPayStrategy implements PayStrategy{
public void pay(double money){
System.out.println(
"微信支付:"+money
);
}
}
银行卡:
class BankPayStrategy implements PayStrategy{
public void pay(double money){
System.out.println(
"银行卡支付:"+money
);
}
}
现在:
每个策略负责自己的逻辑。
3. 使用策略模式以后
以前:
订单系统
判断用户选择
if支付宝
执行支付宝逻辑
if微信
执行微信逻辑
现在:
订单系统
|
|
↓
PayStrategy
|
|
↓
支付宝策略
微信策略
银行卡策略
订单系统不用知道:
支付宝怎么支付。
微信怎么支付。
它只知道:
PayStrategy.pay()
4. 实际调用
比如:
用户选择微信:
PayStrategy strategy =
new WechatPayStrategy();
strategy.pay(100);
输出:
微信支付:100
选择支付宝:
PayStrategy strategy =
new AliPayStrategy();
strategy.pay(100);
输出:
支付宝支付:100
5. 策略模式解决的核心问题
看这句话:
如果一个类里面出现大量 if else,根据不同条件执行不同逻辑,那么这些逻辑很可能可以抽成策略。
例如:
优惠计算
普通用户
9折
VIP用户
8折
超级VIP
7折
它们都是:
计算价格
只是算法不同。
所以:
DiscountStrategy
登录方式
手机号登录
微信登录
QQ登录
Github登录
都是:
登录
只是实现不同。
所以:
LoginStrategy
文件上传
上传到:
阿里云
腾讯云
AWS
都是:
上传文件
只是实现不同。
所以:
UploadStrategy
6. 那工厂为什么经常和策略一起出现?
因为:
策略解决:
怎么执行?
工厂解决:
选择哪个策略?
举个例子:
用户:
pay("wechat")
这里的问题:
我要哪个支付方式?
工厂:
PayFactory
wechat -> WechatPayStrategy
alipay -> AliPayStrategy
bank -> BankPayStrategy
返回:
PayStrategy strategy =
PayFactory.get("wechat");
然后:
strategy.pay();
组合后:
用户请求
|
↓
PayFactory
|
↓
选择策略对象
|
↓
WechatPayStrategy
|
↓
执行支付逻辑
7. 你这个优惠代码为什么是策略模式?
你的场景:
身份不同
↓
优惠规则不同
↓
计算价格方式不同
所以:
UserDiscountStrategy
VipDiscountStrategy
VvipDiscountStrategy
都是策略。
但是:
选择:
"user"
对应:
UserDiscountStrategy
这个动作属于:
工厂。
所以最终:
策略模式 + 工厂模式
8. 判断口诀
看到:
多个 if else 判断执行不同算法
问:
是不是同一个事情有多个做法?
如果:
是
↓
策略模式
例如:
支付
优惠
登录
排序
压缩
序列化
负载均衡
都是策略。
一句话:
策略模式就是把一堆“不同算法/不同规则”的代码拆开,让它们可以互相替换,而业务代码只依赖统一接口。
你后面看 RPC 的时候,会大量遇到:
工厂负责拿策略,策略负责干活。 这个组合是很多中间件设计的核心。
策略模式解决的是:同一个事情,有很多种做法,运行时根据情况选择一种做法
http://clxhxhhr.top/posts/378/ 评论
0 条
还没有评论,先写一条吧。