策略模式是行为模式的一种,它对一系列算法加以封装,为所有算法定义一个抽象的算法接口。具体的算法选择由客户端决定。策略模式主要用来平滑的处理算法的切换。
角色和职责:
1.环境角色(Context)-Context:
持有Strategy的引用
2.抽象策略(Strategy)-Strategy:
这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口
3.具体策略(Concrete Strategy)-Md5Strategy、RsaStrategy:
包装了相关的算法或行为
UML图:
具体代码:
/** * 抽象策略接口 */public interface Strategy { void encrypt();//加密}
/** * MD5加密 */public class Md5Strategy implements Strategy{ @Override public void encrypt() { System.out.println("进行MD5加密"); }}
/** * RSA加密 */public class RsaStrategy implements Strategy{ @Override public void encrypt() { System.out.println("进行RSA加密"); }}
/** * 算法的引用,客户端调用它来抉择具体的算法 */public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public void encrypt(){ this.strategy.encrypt(); }}
public class Main { public static void main(String[] args) { Context contextMD5 = new Context(new Md5Strategy());//MD5加密 contextMD5.encrypt(); Context contextRSA = new Context(new RsaStrategy());//RSA加密 contextRSA.encrypt(); }}
结果:
进行MD5加密
进行RSA加密
优缺点:
优:
- 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复
- 使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
缺:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况
- 由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观
源码地址:https://github.com/qjm201000/design_pattern_strategy.git