策略模式

2020-06-11  本文已影响0人  more2023

一、什么是策略模式

策略模式(Strategy Pattern):定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。策略模式是一种对象行为型模式。

二、适用场景

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句(if - else)来实现。

三、策略模式结构图

策略模式结构图.png

Context(环境类):使用算法的角色。
Strategy(抽象策略类):策略抽象类。
ConcreteStrategy(具体策略类):具体策略实现类。

四、代码示例

支付系统中,有很多支付策略,比如支付宝,微信,银联。在支付时需要选择其中一种支付策略进行支付业务。

4.1、策略抽象类(Strategy)
public interface IPayStrategy{
      public void pay();//支付
}
4.2、具体策略实现类(ConcreteStrategy)

支付宝支付

public class AliPayStrategy implements IPayStrategy{
    @Override
    public void pay() {
        log.info("支付宝支付.");
    }
}

微信支付

public class WexinPayStrategy implements IPayStrategy {
    @Override
    public void pay() {
        log.info("微信支付.");
    }
}

银联支付

public class UnionPayStrategy implements IPayStrategy{
    @Override
    public void pay() {
        log.info("银联支付.");
    }
}
4.3、上下文环境类(Context)
public class PayStrategyContext {
    private IPayStrategy payStrategy;
    /**
     * 执行支付
     */
    public void excutePay() {
        if (null == payStrategy) {
            throw new RuntimeException("支付策略未配置");
        }
        payStrategy.pay();
    }
    public IPayStrategy getPayStrategy() {
        return payStrategy;
    }
    public void setPayStrategy(IPayStrategy payStrategy) {
        this.payStrategy = payStrategy;
    }
}
4.4、客户端类
public class Client {
    public static void main(String[] args) {
        //执行上下文环境类
        PayStrategyContext payStrategyContext = new PayStrategyContext();
        IPayStrategy payStrategy = null;
        //1.支付宝支付
        payStrategy = new AliPayStrategy();
        payStrategyContext.setPayStrategy(payStrategy);
        payStrategyContext.excutePay();
        //2.微信支付
        payStrategy = new WexinPayStrategy();
        payStrategyContext.setPayStrategy(payStrategy);
        payStrategyContext.excutePay();
        //3.银联支付
        payStrategy = new UnionPayStrategy();
        payStrategyContext.setPayStrategy(payStrategy);
        payStrategyContext.excutePay();
    }
}

五、策略模式的优缺点

5.1、优点

1、算法可以自由切换。
2、避免使用多重条件(if - else)判断。
3、扩展性良好。

5.2、缺点

1、策略类会增多。
2、所有策略类都需要对外暴露。

上一篇 下一篇

猜你喜欢

热点阅读