策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 策略模式的好处在于你可以动态的改变对象的行为。
策略模式主要有三个对象:抽象策略对象(它可由接口或抽象类来实现。),具体策略对象(它封装了实现同不功能的不同算法。),环境对象(该类中实现了对抽象策略中定义的接口或者抽象类的引用。)
具体代码
抽象接口
package strategy; public interface TravelStrategy { public void travelAlgorithm(); }
具体实现类坐火车类
package strategy; public class TrainStrategy implements TravelStrategy{ @Override public void travelAlgorithm() { System.out.println("i'm travel by train"); } }
具体实现类坐飞机类
package strategy; public class AirStrategy implements TravelStrategy{ @Override public void travelAlgorithm() { System.out.println("i'm travel by airplane"); } }
具体实现类骑自行车类
package strategy; public class BicycleStrategy implements TravelStrategy{ @Override public void travelAlgorithm() { System.out.println( "i'm travel by bike"); } }
环境对象
package strategy; /** * 环境对象 * @author mercy * */ public class PersonContext { private TravelStrategy strategy; public PersonContext(TravelStrategy strategy){ this.strategy=strategy; } public void travelAlgorithm(){ this.strategy.travelAlgorithm(); } }
测试类
package strategy; public class Test { public static void main(String[] args) { PersonContext strategy=new PersonContext(new AirStrategy()); strategy.travelAlgorithm(); strategy=new PersonContext(new BicycleStrategy()); strategy.travelAlgorithm(); strategy=new PersonContext(new TrainStrategy()); strategy.travelAlgorithm(); } }
结果
i'm travel by airplane i'm travel by bike i'm travel by train
可以发现策略模式和代理模式在代码上还是有点像的,唯一的区别就是环境对象类不需要实现抽象接口,也就是说这个类统一了具体的行为。而代理类需要实现抽象接口,就是说代理类可以允许不同的行为实现。