策略模式,是如何解耦算法的?

2022-05-21  本文已影响0人  程就人生

策略模式,是对谁和谁的解耦?

策略模式,怎么用?


策略模式(Strategy Pattern),定义了一系列算法并分别封装起来,算法间可以互换。它是一种行为型模式。

特点:对算法和算法使用者进行解耦。

业务场景:对算法和算法使用者进行分离的场景。

关键代码:一个策略接口类及一系列算法实现。

下面看UML类图:


类图说明:支付策略接口类IPayStrategy,它有两个实现类AliyunPay阿里云支付类、WxinPay微信支付类,还可以扩展更多的其他支付类;Order订单类,算法的使用者,最终只使用一种支付算法。

下面看代码实现:

1.支付策略接口类;

/**
 * 1.支付策略接口类
 * @author 程就人生
 * @Date
 */
public interface IPayStrategy {

  /**
   * 支付
   * @param money 支付金额
   */
  public void pay(double money);
}

2.支付具体实现类;

/**
 * 2.1 阿里云支付
 * @author 程就人生
 * @Date
 */
public class AliyunPay implements IPayStrategy{

  @Override
  public void pay(double money) {
    System.out.println("使用支付宝支付:" + money + "元");
  }
}
/**
 * 2.2 微信支付
 * @author 程就人生
 * @Date
 */
public class WxinPay implements IPayStrategy{

  @Override
  public void pay(double money) {
    System.out.println("使用微信支付:" + money + "元");
  }
}

3.订单类,支付策略的使用者;


/**
 * 3.订单简单实现
 * @author 程就人生
 * @Date
 */
public class Order {
    private IPayStrategy payStrategy;
    
    private double orderPrice;

  public Order(IPayStrategy payStrategy) {
    this.payStrategy = payStrategy;
  }
    
    public void pay(){
      payStrategy.pay(orderPrice);
    }

  public double getOrderPrice() {
    return orderPrice;
  }

  public void setOrderPrice(double orderPrice) {
    this.orderPrice = orderPrice;
  }
}

4.测试代码;

public static void main(String[] argo){
    // 生成的订单,使用支付宝支付
    Order order1 = new Order(new AliyunPay());
    order1.setOrderPrice(100);
    order1.pay();
    
    // 生成的订单,使用微信支付
    Order order2 = new Order(new WxinPay());
    order2.setOrderPrice(200);
    order2.pay();
}

运行结果:

使用支付宝支付:100.0元
使用微信支付:200.0元

这段代码的意思是:在网上下了两个订单,一个使用支付宝支付,一个使用微信支付。一个订单,要么使用微信支付,要么使用支付宝支付,当然还可以扩展其他类型的支付,任凭客户选择其中的一种支付方式。这就是策略模式的简单使用。

最后总结

策略模式,是对算法和算法使用者的解耦。从代码优化上来看,可以避免多重条件判断if else 、switch等。有利于扩展,只需增加策略的实现类,符合开闭原则。

在你的项目中,有类似于支付这样的场景吗?

如果有,你是怎么处理的?是否还有优化的空间?

上一篇 下一篇

猜你喜欢

热点阅读