策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口!
比如,我要回家,可以步行,可以打车,可以坐公车!
首先定义一个小明回家的策略接口:
public interface GoHomeStrategy {
public void goHome();
}
public class GoHomeByTaxiStrategy implements GoHomeStrategy {
@Override
public void goHome() {
System.out.println("打车回家回家");
}
}
钱不多的时候 坐公车回家
public class GoHomeByBusStrategy implements GoHomeStrategy {
@Override
public void goHome() {
System.out.println("坐公车回家");
}
}
没钱的时候,走路回家(可怜的娃)
public class GoHomeByWalkStrategy implements GoHomeStrategy {
@Override
public void goHome() {
System.out.println("步行回家");
}
}
这里顶一个环境类,让用户决定使用哪一种解决方案
public class GoHomeContext {
private GoHomeStrategy mGoHomeStrategy;
public GoHomeContext(GoHomeStrategy mGoHomeStrategy){
this.mGoHomeStrategy = mGoHomeStrategy;
}
//修改回家方案
public void setGoHomeStrategy(GoHomeStrategy mGoHomeStrategy){
this.mGoHomeStrategy = mGoHomeStrategy;
}
public void goHome(){
mGoHomeStrategy.goHome();
}
}
测试类
public static void main(String[] args) {
GoHomeContext mGoHomeContext = new GoHomeContext(new GoHomeByBusStrategy());
mGoHomeContext.goHome();
System.out.println("现在改成");
mGoHomeContext.setGoHomeStrategy(new GoHomeByWalkStrategy());
mGoHomeContext.goHome();
}
本来小明选的是打车回家的方案,可是一摸口袋钱包被偷了,公车都没发坐,只好改成了走路回去!
打印结果!
坐公车回家
现在改成
步行回家
下面几句话来自(http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html)
策略模式的优点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。