策略模式:
策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。并且不会影响客户端的操作。
策略模式的优点有:策略模式提供了管理相关的算法族的办法、策略模式提供了可以替换继承关系的办法、使用策略模式可以避免使用多重条件转移语句。
策略模式结构图:
具体简单实现:
策略类父类、
/** * @author:shaoyongzhang * @date 2018/5/29 * @description 策略类父类 */ public abstract class Clearing { protected String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Clearing() { } public Clearing(String name) { this.name = name; } public abstract void clearMethod(); }
具体策略类A、
/** * @author:shaoyongzhang * @date 2018/5/29 * @description */ public class ClearingA extends Clearing { @Override public void clearMethod() { System.out.println("策略类名:" + this.name); System.out.println("策略方法A"); } }
具体策略类B、
/** * @author:shaoyongzhang * @date 2018/5/29 * @description */ public class ClearingB extends Clearing { @Override public void clearMethod() { System.out.println("策略类名:" + this.name); System.out.println("策略方法B"); } }
具体策略类C、
/** * @author:shaoyongzhang * @date 2018/5/29 * @description */ public class ClearingC extends Clearing { @Override public void clearMethod() { System.out.println("策略类名:" + this.name); System.out.println("策略方法C"); } }
Context上下文类:
/** * @author:shaoyongzhang * @date 2018/5/29 * @description */ public class Window { /** * 策略方式对象 */ private Clearing clearing; public Clearing getClearing() { return clearing; } public void setClearing(Clearing clearing) { this.clearing = clearing; } public void clearWindow(){ clearing.clearMethod(); } }
客户端类测试:
/** * @author:shaoyongzhang\ * @date 2018/5/29 * @description */ public class Main { public static void main(String[] args) { //管理策略对象,根据传入的策略对象来调用其对应的策略方法 Window window = new Window(); //创建策略对象 Clearing clearingA = new ClearingA(); clearingA.setName("策略对象A"); window.setClearing(clearingA); window.clearWindow(); Clearing clearingB = new ClearingB(); clearingB.setName("策略对象B"); window.setClearing(clearingB); window.clearWindow(); Clearing clearingC = new ClearingC(); clearingC.setName("策略对象C"); window.setClearing(clearingC); window.clearWindow(); } }
输出:
策略模式总结
策略模式是一种定义了一系列算法的方法,所有的算法都是完成相同的工作,只不过是各自算法的实现不同,它以相同的方式调用不同的算法,减少了算法类与算法类使用对象之间的耦合。(策略类(Strategy)使用抽象类来定义是因为抽象类里面可以定义属性,以及一系列的公有方法,使用继承可以重用这些属性以及方法,避免了大量的重复代码)
优点
策略类(Strategy)类为上下文类(Context)定义了一系列可供重用的算法以及行为,每个具体类实现自己的算法,优化了单元测试,每个策略类单独测试,而且刚好符合了设计模式的单一职责原则,一个算法类就完成一个算法。
使用策略模式还可以避免使用多重条件转移语句。多重转移语句不易维护,多重转移语句把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,这样的代码可维护性还有扩展性都比较差。
缺点
1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。