文章

策略模式使用

设计模式之策略模式

定义一个算法族,封装每个算法,它们可以随时转换。策略模式可以使该算法的变化与使用它的客户端无关。
比如一个电子商务平台可以根据用户的选择来使用不同的支付策略,例如支付宝支付、微信支付等。

//策略接口
@FunctionalInterface
public interface PayStrategy {
void execute();
}

//策略接口微信支付
public class WXPayStrategy implements PayStrategy {
  @Override
  public void execute() {
      System.out.println("-------微信支付-------");
  }
}
//策略接口支付宝支付
public class AliPayStrategy implements PayStrategy{
  @Override
  public void execute() {
      System.out.println("-------支付宝支付-------");
  }
}

顾客


public class Customer {
  private PayStrategy strategy;

  public Customer(PayStrategy strategy) {
      this.strategy = strategy;
  }

  public void changeStrategy(PayStrategy strategy) {
      this.strategy = strategy;
  }

  public void pay() {
      strategy.execute();
  }
}

应用

public class App {
  public static void main(String[] args) {
      Customer customer = new Customer(new AliPayStrategy());
      customer.pay();
      customer.changeStrategy(new WXPayStrategy());
      customer.pay();

//        lambda
      customer.changeStrategy(LambdaStrategy.Strategy.AliPayStrategy);
      customer.pay();
      customer.changeStrategy(LambdaStrategy.Strategy.WXPayStrategy);
      customer.pay();

  }
}

lambda写法

public class LambdaStrategy {

  public enum Strategy implements PayStrategy {
      AliPayStrategy(() -> {
          System.out.println("-------支付宝支付-------");
      }),
      WXPayStrategy(() -> {
          System.out.println("-------微信支付-------");
      });

      private final PayStrategy payStrategy;

      Strategy(PayStrategy payStrategy) {
          this.payStrategy = payStrategy;
      }

      @Override
      public void execute() {
          payStrategy.execute();
      }
  }
}
License:  CC BY 4.0