设计模式-策略模式
参考:https://blog.51cto.com/u_16125162/6329805
定义:#
策略模式(StrategyPattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。是一种对象行为型模式。
- 打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。
- 再打个比方,我们购物下单需要支付时,你可以选择支付宝支付,微信支付,银联支付,每一种支付方式也是一种策略
模式结构#
-
环境角色(Context):持有一个策略类的引用,提供给客户端使用。
-
抽象策略角色(Strategy):这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
-
具体策略角色(ConcreteStrategy):包装了相关的算法或行为
案例#
- 抽象策略模式(Strategy)
public interface Payment {
String pay(String uid, double amount);
}
- 具体策略模式(ConcreteStrategy)
/**
* 支付宝pay
*/
public class AliPay implements Payment {
public String pay(String uid,double amount) {
System.out.println("欢迎使用支付宝");
System.out.println("查询账户余额,开始扣款");
return "支付成功,扣款:"+ amount;
}
}
/**
* 微信支付
*/
public class WeChatPay implements Payment {
public String pay(String uid,double amount) {
System.out.println("欢迎使用银联卡");
System.out.println("查询账户余额,开始扣款");
return "支付成功,扣款:"+ amount;
}
}
/**
* 银联支付
*/
public class UnionPay implements Payment {
public String pay(String uid,double amount) {
System.out.println("欢迎使用银联卡");
System.out.println("查询账户余额,开始扣款");
return "支付成功,扣款:"+ amount;
}
}
- 环境角色(context)
public class PayContext {
private Payment payment;
public PayContext(Payment payment){
this.payment = payment;
}
public String pay(String uid, double amount){
return payment.pay(uid,amount);
}
}
- 测试类
/**
* 订单类
*/
@Data
public class Order {
private String uid;
private String orderId;
private double amount;
public Order(String uid, String orderId, double amount) {
this.uid = uid;
this.orderId = orderId;
this.amount = amount;
}
}
- 测试
public class PayStrategyTest {
public static void main(String[] args) throws Exception{
//下单
Order order = new Order("1","20200311",100);
PayContext payContext = null;
//开始支付,选择支付方式:支付宝 ALI_PAY、银联卡 UNION_PAY、微信支付 WECHAT_PAY
//每个渠道它的支付的具体算法不一样
String payType = "WECHAT_PAY";
if("ALI_PAY".equals(payType)){
payContext = new PayContext(new AliPay());
} else if("WECHAT_PAY".equals(payType)){
payContext = new PayContext(new WeChatPay());
} else if("UNION_PAY".equals(payType)){
payContext = new PayContext(new UnionPay());
} else {
throw new Exception("支付异常");
}
System.out.println(payContext.pay(order.getUid(),order.getAmount()));
}
}
优缺点#
优点#
- 策略模式提供了对“开闭原则”的完美支持,用户可以在不 修改原有系统的基础上选择算法或行为,也可以灵活地增加 新的算法或行为。
- 策略模式提供了管理相关的算法族的办法。
- 策略模式提供了可以替换继承关系的办法。
- 使用策略模式可以避免使用多重条件转移语句。
缺点#
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式将造成产生很多策略类,可以通过使用享元模式在一 定程度上减少对象的数量。
作者:hasome
出处:https://www.cnblogs.com/hasome/p/17792524.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)