前言:
Strategy模式也叫策略模式,是行为模式之一,它对一系列算法加以封装,并且算法可以相互切换,让算法独立于使用它的客户而独立变化,首先为所有算法定义一个抽象的算法接口,每种算法都继承这个接口,并加以封装和实现,具体算法交由客户端决定。
使用场景:
1.同一个问题有多种处理方式,只有行为不同。
2.用很多if .. else if...来判断一个抽象类的子类的执行
怎么实现:
算法抽象类
算法具体实现
策略的外部封装类
代码:
创建一个加密算法的抽象父类:
package com.xhx.designpatter; /** * xuhaixing * 2018/6/18 18:13 * * 策略的抽象 **/ public interface Strategy { void encrypt(); }
具体实现类
md5加密:
package com.xhx.designpatter; /** * xuhaixing * 2018/6/18 18:15 * 策略的具体实现,不与业务代码在一起,还可以独立演化 **/ public class MD5Strategy implements Strategy { public void encrypt() { System.out.println("执行md5加密"); } }
mds加密:
package com.xhx.designpatter; /** * xuhaixing * 2018/6/18 18:16 **/ public class MDSStrategy implements Strategy { public void encrypt() { System.out.println("执行MDS加密"); } }
执行策略的类:根据传入的策略,执行
package com.xhx.designpatter; /** * xuhaixing * 2018/6/18 18:20 * * 策略的外部封装类,根据不同策略执行不同行为,策略由外部环境决定 **/ public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy=strategy; } public void encrypt(){ this.strategy.encrypt(); } }
测试方法:
package com.xhx.designpatter; /** * xuhaixing * 2018/6/18 18:19 **/ public class App { public static void main(String[] args) { //具体执行哪个策略由外部环境决定,这里可以融合工厂模式 //Context context = new Context(new MD5Strategy()); Context context = new Context(new MDSStrategy()); context.encrypt(); } }
在使用过程中可以把创建策略对象放到工厂中,在执行策略类中根据传入的策略对象或者传入的条件,执行相应的策略。