设计模式——策略模式
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
优点
1、提供了一种替代继承的方法,而且既保持了继承的优点(代码重用)还比继承更灵活(算法独立,可以任意扩展)。
2、避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。
3、遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
缺点
没一种策略都会添加一个子类
模式的组成
环境类(Context):用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
抽象策略类(Strategy):定义所有支持的算法的公共接口。 Context使用这个接口来调用某ConcreteStrategy定义的算法。
具体策略类(ConcreteStrategy):以Strategy接口实现某具体算法。
实现
在人们出门的出行方式,我们在这个场景进行实现。类图如下:
ITravelStrategy的定义:
package com.lidaming.design17.strategy; public interface ITravelStrategy { void travel(); }
TravelContext的实现:
package com.lidaming.design17.strategy; public class TravelContext { private ITravelStrategy travelStrategy; public TravelContext(ITravelStrategy strategy) { travelStrategy = strategy; } public void setStrategy(ITravelStrategy strategy) { travelStrategy = strategy; } public void travel() { travelStrategy.travel(); } }
Bike的实现:
package com.lidaming.design17.strategy; public class Bike implements ITravelStrategy { public void travel() { System.out.println(" travel by bike"); } }
Train的实现:
package com.lidaming.design17.strategy; public class Train implements ITravelStrategy { public void travel() { System.out.println("travel on train"); } }
Bus的实现:
package com.lidaming.design17.strategy; public class Bus implements ITravelStrategy { public void travel() { System.out.println("travel on bus"); } }
场景类的实现:
package com.lidaming.design17.strategy; public class Client { public static void main(String[] args) { TravelContext travelContext = new TravelContext(new Bike()); travelContext.travel(); System.out.println("it takes too long"); travelContext.setStrategy(new Bus()); travelContext.travel(); System.out.println("it is too expensive"); travelContext.setStrategy(new Train()); travelContext.travel(); System.out.println("it just fine"); } }
参考
http://blog.csdn.net/hguisu/article/details/7558249