策略模式使用
设计模式之策略模式
定义一个算法族,封装每个算法,它们可以随时转换。策略模式可以使该算法的变化与使用它的客户端无关。
比如一个电子商务平台可以根据用户的选择来使用不同的支付策略,例如支付宝支付、微信支付等。
//策略接口
@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