行为模式之一。 它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现。 主要用来平滑地切换算法。
角色和职责: Strategy:策略的抽象 ConcreteStrategy:各种策略的具体实现 Context:策略的外部封装类,或者说策略的容器类。根据不同策略执行不同的行为。策略由外部环境决定。
优点: 1.提供了管理相关算法族的办法。恰当的使用继承可以把公共戴拿转移到父类里面,避免代码重复。 2.提供了可以替换继承关系的办法。继承可以处理多种算法或行为。 3.可以避免使用多重条件转移语句。
缺点: 1.客户端必须直到所有策略类,并自行决定使用哪一个策略类。 2.策略模式造成很多的策略类,有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式(数据相同可共享)来减少对象的数量。
public class MainClass { public static void main(String[] args) { //Strategy strategy = new MD5Strategy(); //strategy.encrypt(); Context context = new Context(new MD5Strategy()); context.encrypt(); } } public interface Strategy { //加密 public void encrypt(); } public class MD5Strategy implements Strategy{ @Override public void encrypt() { System.out.println("MD5加密"); } } public class MDSStrategy implements Strategy{ @Override public void encrypt() { System.out.println("MDS加密"); } } public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public void encrypt(){ this.strategy.encrypt(); } }备注: 1.为了“复用”,(reuse)目的而使用继承,结局并不完美。
利用多态,程序可以针对超类型编程,执行时会根据实际状况执行真正的行为,不会被绑死在超类型的行为上。 将容易改变的行为封装为接口,并实现。2.多用组合,少用继承。