Define a family of algorithms, encapsulate each one, and make them interchangeable.
定义一组算法,将每个算法封装起来,并且使他们之间可以互换。
策略、算法家族的抽象,通常为接口。定义每个算法必须具有的方法和属性。
public interface Strategy{ public void algorithmInterface(); }
实现抽象策略中的操作,定义具体的算法。
public class ConcreteStrategy1 implements Strategy { public void algorithmInterface(){ } }
也叫做上下文角色,起承上启下 封装作用。屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
public class Context { private Strategy strategy = null; public Context (Strategy s) { this.strategy = s; } //封装后的策略方法 public void doAnything() { this.strategy.algorithmInterface(); } }
最后一条,可结合其他模式进行修正,例如工厂方法模式、代理模式、享元模式。
由于上文所述的缺点,策略模式很少单独使用。
public enum Calculator { ADD("+") { public int exec(int a, int b) { return a + b; } }, SUB("-") { public int exec() { return a - b; } }; String value = ""; private Calculator(String value) { this.value = value; } //策略方法 public abstract int exec(int a, int b); } public class Client { .... Calculator.ADD.exec(1, 2); }
Strategy策略角色
//fly策略(算法) public interface FlyBehavior { public void fly(); } public class FlyWithWings implements FlyBehavior { public void fly() {....} } public class FlyNoWay implements FlyBehavior { public void fly() {....} } //quack策略(算法) public interface QuackBehavior { public void quack(); } 。。。
Context封装角色
public abstract class Duck { //为什么不implements这2个接口? //因为“组合优于继承”;这样就可以在运行时动态地改变行为。 FlyBehavior flyBehavior; QuackBehavior quackBehavior; public void setters(){...}... public abstract void display(); public void performFly(){ flyBehavior.fly(); //委托 } public void performQuack() { quackBehavior.quack(); } }
都是用来封装算法。
模板方法:使用继承来定义算法中的个别步骤
策略模式:通过对象组合,让客户可以选择算法实现