美文网首页
策略模式(Strategy Pattern)

策略模式(Strategy Pattern)

作者: 虎三呀 | 来源:发表于2018-09-19 16:57 被阅读0次

模式定义

定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换 & 让算法可在不影响客户端的情况下发生变化

简单来说:准备一组算法 & 将每一个算法封装起来,让外部按需调用 & 使得互换

作用(解决的问题)

将算法的责任和本身进行解耦,使得:

1、算法可独立于使用外部而变化
2、客户端方便根据外部条件选择不同策略来解决不同问题

策略模式仅仅封装算法(包括添加 & 删除),但策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定

UML类图

角色解析

Strategy :抽象方案
StrategyA 、StrategyB:具体方案
Context :方案执行者

实例讲解

使用场景:任何可以替换方案的场景,比如 做公交收费、商场促销活动方案、等等...

public abstract class Strategy {
      public abstract void operate();
}

public class StrategyA extends Strategy{
    @Override
    public void operate() {
        System.out.println("StrategyA - 算法");
    }

}

public class StrategyB extends Strategy{
    @Override
    public void operate() {
        System.out.println("StrategyB - 算法");
    }

}

public class Context {
    // 持有抽象策略角色的引用
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    public void operate() {
        strategy.operate();
    }
}

public class Client {
    public static void main(String[] args) {
        Context cxt = new Context();
        //A方案
        cxt.setStrategy(new StrategyA());
        cxt.operate();
        //B方案
        cxt.setStrategy(new StrategyB());
        cxt.operate();
    }
}

优缺点

在全面解析完后,我来分析下其优缺点:
优点

  • 策略类之间可以自由切换
    由于策略类都实现同一个接口,所以使它们之间可以自由切换。

  • 易于扩展
    增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“
    避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
    策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

相关文章

网友评论

      本文标题:策略模式(Strategy Pattern)

      本文链接:https://www.haomeiwen.com/subject/knbinftx.html