设计模式—策略模式

策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。 (摘自<大话设计模式>)

这种类型的设计模式属于行为型模式

优点

  • 算法可以自由切换
  • 避免使用多重条件判断
  • 扩展性良好

缺点

  • 策略类数量增多
  • 所有的策略类都需要对外暴露

使用场景

(参考菜鸟教程总结)

  • 算法的选择性:当程序需要根据不同的情况选择不同的算法或策略时,策略模式可以很好地应用。它允许在运行时动态地切换算法,使得系统更具灵活性和可扩展性。
  • 多个类似行为的存在:如果一个类拥有多个类似的行为,但每个行为在实现上有所不同,那么可以使用策略模式来将这些行为封装在独立的策略类中,并使它们可以互相替换。这样可以避免使用大量的条件语句或分支逻辑,使代码更加清晰和可维护。
  • 避免暴露复杂的条件逻辑:当存在大量复杂的条件逻辑时,使用策略模式可以将这些逻辑封装在具体的策略类中,使得主体逻辑更加简洁,易于理解和维护。

注意事项

如果系统中的一个策略家族的具体策略数量超过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元

posted @   弘一  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示