咱们如今假定一种场景:算法
规则以下,若是时间大于60分钟,选择步行,30-60分钟,选择骑车,10-30分钟,选择巴士,小于10分钟,就不出门了。ide
若是不用模式的话,咱们能够用if else的方式在客户端的代码中填上咱们的规则,可是这样的坏处是若是之后时间被继续细化,出行方式更多的话,那客户端就要不断的修改代码。而后须要从新测试过每一种可能。策略模式最大的好处是算法的改变不影响客户端的调用。客户端直接与算法调度器合做,算法调度器根据条件选择适合的算法。而后再执行,下面是个例子。测试
package com.spell.designPattern.strategy;自行车方式上班……
/**
* 出行策略接口,出行的方式有步行、跑步、自行车、公交车、自驾车等
*
* @author Administrator
*
*/
public interface ArriveStrategy {
/**
* 抵达方式
*/
public void howToArrive();
}
package com.spell.designPattern.strategy;巴士出行
/**
* 出行方式:自行车
*
* @author Administrator
*
*/
public class ArriveStrategyBike implements ArriveStrategy {
public void howToArrive() {
System.out.println("骑车出行,速度是15km/h");
}
}
package com.spell.designPattern.strategy;走路的方式
public class ArriveStrategyBus implements ArriveStrategy {
public void howToArrive() {
System.out.println("公交车出行,速度是40km/h");
}
}
package com.spell.designPattern.strategy;根据时间,选择合适的出行方式:
public class ArriveStrategyWalk implements ArriveStrategy {
public void howToArrive() {
System.out.println("步行,速度是3KM/H");
}
}
package com.spell.designPattern.strategy;偶的上班选择……
/**
* 出行策略选择,根据剩余的时间来选择某种方式
*
* @author Administrator
*
*/
public class StrategySelector {
/**
* 根据时间来选择对应的策略
*
* @param time
* @return
*/
public ArriveStrategy get(int time) {
if (time >= 60) {
// 有足够的时间,就走路过去
return new ArriveStrategyWalk();
} else if (time >= 30) {
// 时间还有点,骑自行车就能够解决
return new ArriveStrategyBike();
} else if (time >= 10) {
// 时间很少了,公交车会更快点
return new ArriveStrategyBus();
} else {
// 怎么都来不及了,仍是请假吧
return null;
}
}
}
package com.spell.designPattern.strategy;能够看到,client只和策略选择器合做,因此之后若是有新的算法出现,只要实现出行接口,修改策略选择器就能够了,客户端代码没必要作任何修改,比if-else是否是看的更舒服点呢!
/**
* 一个上班族的出行选择
*
* @author Administrator
*
*/
public class Client {
private StrategySelector selector = new StrategySelector();
/**
* 去公司上班,出行方式根据剩下的时间来选择
*
* @param time
*/
public void toCompany(int time) {
ArriveStrategy strategy = selector.get(time);
if (strategy != null) {
strategy.howToArrive();
} else {
System.out.println("怎么也来不及了,打请假电话中……");
}
}
public static void main(String[] args) {
Client client = new Client();
client.toCompany(60);
client.toCompany(40);
client.toCompany(15);
client.toCompany(5);
}
}