美文网首页
策略模式

策略模式

作者: FredWhite | 来源:发表于2019-11-09 21:07 被阅读0次

定义

定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

使用场景

  • 针对同一类问题的多种不同的处理方式,仅仅是具体行为有差别时。
  • 需要安全的封装多种同一类型的操作时。
  • 出现同一抽象类有多个子类,而又需要 if-else 或 switch-case 来选择具体子类时。

实现方式

背景:公司搞团拜会,有一个抽奖环节,现在拟定有3套方案供选择,具体哪一套会视情况而定
解决方案:策略模式。

Strategy(抽象类)

public abstract class LuckyDrawStrategy {
    public abstract void luckyDraw();
}

ConcreteStrategy(具体策略类)

传统抽奖

public class TraditionStrategy extends LuckyDrawStrategy {
    @Override
    public void luckyDraw() {
        System.out.println("采用传统(乒乓球)抽奖");
    }
}

软件抽奖

public class SoftwareStrategy extends LuckyDrawStrategy {
    @Override
    public void luckyDraw() {
        System.out.println("采用抽奖软件抽奖");
    }
}

钉钉抽奖

public class DingDingStrategy extends LuckyDrawStrategy {
    @Override
    public void luckyDraw() {
        System.out.println("采用钉钉签到抽奖");
    }
}

测试

public class StrategyTest {
    public static void main(String[] args) {
        private enum Strategy = {TRADITION, SOFTWARE, DINGDING};
        private LuckyDrawStrategy luckyDrawStrategy = null;
        switch(Strategy) {
            case Strategy.TRADITION:
                luckyDrawStrategy = new TraditionStrategy();
                break;
            case Strategy.SOFTWARE:
                luckyDrawStrategy = new SoftwareStrategy();
                break;
            case Strategy.DINGDING:
                luckyDrawStrategy = new DingDingStrategy();
                break;
        }
        luckyDrawStrategy.luckyDraw();
    }
}

优缺点

优点

  • 结构清晰,简单明了。
  • 耦合度相对较低,扩展性较好。
  • 操作封装更彻底,数据更安全。

缺点

  • 随着策略的增加,子类也会繁多。

注意

Android 源码中 Android 动画的 Interpolator(插值器) 所采用的的就是 策略模式。而 LinearInterpolator、CycleInterpolator 等插值器就是具体的实现策略。

相关文章

网友评论

      本文标题:策略模式

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