其思想是针对一组算法,将每一种算法都封装到具备共同接口的独立的类中,从而使它们能够相互替换。策略模式最大的特色是使得算法能够在不影响客户端的状况下发生变化,从而改变不一样的功能。算法
策略模式体现了面向对象程序设计中很是重要的两个原则:编程
举例:
以 Java 中的 TreeSet 为例,TreeSet 仅仅知道它只是接收一个 Comparator 这种接口类型,可是具体是哪一种实现类,TreeSet 并不关心,实现类在真正的传入 TreeSet 以前,TreeSet 自己是不知道的,因此能够本身去实现 Comparator 接口,而后在实现类里面去封装本身的规则(这里的规则能够看成是算法),好比说要实现对一个集合元素的排序,究竟是升序仍是降序由本身控制,能够把这种变化的内容封装到本身的实现类中,真正运行的时候才知道具体的实现。
测试
public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); }
也就是说 TreeSet 在底层使用 TreeMap 来实现的,而在 TreeMap 中持有 Camparator 的引用,private final Comparator<? super K> comparator;
。this
/** * 定义抽象策略角色 * 相似于Comparator 接口 */ public interface Strategy{ /** * 定义了两个数用于计算 */ public int calc(int num1, int num2); }
/** * 定义加法策略 */ public class AddStrategy implements Strategy{ /** * 实现calc 方法,完成两个数相加 */ public int calc(int num1, int num2){ return num1 + num2; } }
/** * 减法策略 */ public class SubtractStrategy implements Strategy{ /** * 实现calc方法,完成两个数相减 */ public int calc(int num1, int num2){ return num1 - num2; } }
/** * 环境角色 * 相似于 TreeSet(其实是TreeMap) */ public class Environment{ // 持有对策略类的引用 private Strategy strategy; // 经过构造方法给抽象策略类的引用赋值 public Environment(Strategy strategy){ this.strategy = strategy; } public int calulate(int a, int b){ retrun strategy.calc(a,b); } }
/** * 测试类 */ public class Test{ public static void main(String[] args){ // 传入具体的策略类构造策略对象以抽象策略角色接收(多态) Environment environment = new Environment(new AddStrategy()); int result environment.calulate(1,2); System.out.println(result); } }