定义
定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
使用场景
- 针对同一类问题的多种不同的处理方式,仅仅是具体行为有差别时。
- 需要安全的封装多种同一类型的操作时。
- 出现同一抽象类有多个子类,而又需要 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 等插值器就是具体的实现策略。
网友评论