灵活的策略模式,让不同策略间自由切换成为可能!

一、策略模式的定义

        策略模式是一种比较简单的模式,也叫做政策模式,他的定义是:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。

        策略模式使用的就是面向对象的继承多态机制,非常容易理解和掌握,我们再来看看策略模式的三个角色:

(1)Context封装角色
        它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
(2)Strategy抽象策略角色
        策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性,
(3)ConcreteStrategy具体策略角色
        实现抽象策略中的操作,该类含有具体的算法。

        

二、策略模式的通用代码

抽象策略角色

public interface Strategy {
    public void doSomething();
}

具体策略角色

public class ConcreteStrategy1 implements Strategy {
    @Override
    public void doSomething() {
        System.out.println("具体策略1的运行法则");
    }
}
public class ConcreteStrategy2 implements Strategy {
    @Override
    public void doSomething() {
        System.out.println("具体策略2的运行法则");
    }
}

封装角色

public class Context {
    private Strategy strategy = null;
 
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
 
    public void doAnything() {
        this.strategy.doSomething();
    }
}

高层模块

public class Client {
    public static void main(String args[]) {
        //声明一个具体的策略
        Strategy strategy = new ConcreteStrategy1();
        Context context = new Context(strategy);
        context.doAnything();
    }
}

三、策略模式的优缺点和使用场景 

策略模式的优点:

  • 算法可以自由切换
  • 避免使用多重条件判断
  • 扩展性良好

策略模式的缺点:

  • 策略类数量增多

        每一个策略类都是一个类,复用的可能性很小,类数量增多。

  • 所有策略类都需要对外暴露

        上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,这与迪米特法则是相违背的。

策略模式的使用场景:

  • 多个类只有在算法或行为上稍有不同的场景
  • 算法需要自由切换的场景
  • 需要屏蔽算法规则的场景

四、策略模式的扩展

        策略枚举定义:

  • 它是一个枚举
  • 他是一个浓缩了策略模式的枚举
public enum Calculator {
    //加法运算
    ADD("+") {
        public int exec(int a, int b) {
            return a + b;
        }
    },
    //减法运算
    SUB("-") {
        public int exec(int a, int b) {
            return a - b;
        }
    };
    //声明一个抽象函数
    public abstract int exec(int a, int b);
}

        策略模式是一个非常优秀和方便的模式,但是它受策略枚举类型的限制,每个枚举项都是 public static final 的,扩展性受到一定的约束。

发布了67 篇原创文章 · 获赞 69 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34519487/article/details/104254914