设计模式—策略模式
策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 (摘自<大话设计模式>)
这种类型的设计模式属于行为型模式。
优点
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好
缺点
- 策略类数量增多
- 所有的策略类都需要对外暴露
使用场景
(参考菜鸟教程总结)
- 算法的选择性:当程序需要根据不同的情况选择不同的算法或策略时,策略模式可以很好地应用。它允许在运行时动态地切换算法,使得系统更具灵活性和可扩展性。
- 多个类似行为的存在:如果一个类拥有多个类似的行为,但每个行为在实现上有所不同,那么可以使用策略模式来将这些行为封装在独立的策略类中,并使它们可以互相替换。这样可以避免使用大量的条件语句或分支逻辑,使代码更加清晰和可维护。
- 避免暴露复杂的条件逻辑:当存在大量复杂的条件逻辑时,使用策略模式可以将这些逻辑封装在具体的策略类中,使得主体逻辑更加简洁,易于理解和维护。
注意事项
如果系统中的一个策略家族的具体策略数量超过4个, 则需要考虑使用混合模式, 解决策略类膨胀和对外暴露的问题, 否则日后的系统维护就会成为一个烫手山芋, 谁都不想接。
案例分析
选择支付方式例子:
- 付款策略接口
/**
* 付款策略
*
* @author admin
*/
public interface IPaymentStrategy {
/**
* 付款
*
* @param price 价格
*/
void pay(Double price);
}
- 付款策略接口-微信实现
/**
* 微信支付
*
* @author admin
*/
public class WechatPaymentStrategy implements IPaymentStrategy {
@Override
public void pay(Double price) {
System.out.println("微信支付:" + price + "元");
}
}
- 付款策略接口-支付宝实现
/**
* 支付宝支付策略
*
* @author admin
*/
public class AlipayPaymentStrategy implements IPaymentStrategy {
@Override
public void pay(Double price) {
System.out.println("支付宝支付:" + price + "元");
}
}
- 付款策略接口-信用卡实现
/**
* 信用卡支付策略
*
* @author admin
*/
public class CreditCardPaymentStrategy implements IPaymentStrategy {
@Override
public void pay(Double price) {
System.out.println("信用卡支付:" + price + "元");
}
}
- 商品信息
/**
* 商品
*
* @author admin
*/
public class Commodity {
// 价格
private double price;
private IPaymentStrategy paymentStrategy;
Commodity(double price, IPaymentStrategy paymentStrategy) {
this.price = price;
this.paymentStrategy = paymentStrategy;
}
public void pay() {
paymentStrategy.pay(this.price);
}
}
- 客户端
/**
* 客户端
*
* @author admin
*/
public class Client {
public static void main(String[] args) {
Commodity commodity1 = new Commodity(20.00, new WechatPaymentStrategy());
commodity1.pay();
Commodity commodity2 = new Commodity(122.00, new AlipayPaymentStrategy());
commodity2.pay();
Commodity commodity3 = new Commodity(43.00, new CreditCardPaymentStrategy());
commodity3.pay();
}
}
- 输出结果
微信支付:20.0元
支付宝支付:122.0元
信用卡支付:43.0元
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性