Java 设计模式_策略模式
本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.youkuaiyun.com/Rozol/article/details/76268996
策略模式是对算法的包装, 让算法独立于使用它的客户端而发生变化
该策略模式可避免向 if-else / swith 语句那样. 当算法发生变化时需要对客户端做响应修改(添加判断)
策略模式
public interface TravelStrategy {
/**
* 出行费用
* @param km
* @return
*/
int calculatePrice(int km);
}
- 定义一个抽象策略接口(TravelStrategy), 里面定义了一个子类都需要实现的计算出行费用的方法
public class BusStrategy implements TravelStrategy{
@Override
public int calculatePrice(int km) {
// 实现相关业务与算法
return km * 1000;
}
}
public class TaxiStrategy implements TravelStrategy {
@Override
public int calculatePrice(int km) {
return km * 2000;
}
}
- 子类实现TravelStrategy接口, 子类中根据各自的职责实现 calculatePrice 方法的不同的算法
public class Context {
private TravelStrategy strategy;
public Context(TravelStrategy strategy){
this.strategy = strategy;
}
public int calclatePrice(int km){
return strategy.calculatePrice(km);
}
}
- 环境类 Context 持有 TravelStrategy 的引用, 当需要计算出行费用时, 由他负责调用 TravelStrategy 中的 calculatePrice 方法以计算出行费用
使用
public class Test {
public static void main(String[] args) {
Context context = new Context(new BusStrategy());
int cost = context.calclatePrice(100);
System.out.println("出行费用为: " + cost);
context = new Context(new TaxiStrategy());
cost = context.calclatePrice(200);
System.out.println("出行费用为: " + cost);
}
}
- 从使用中可见, 我们仅需给Context传递不同的 TravelStrategy 的子类对象即可帮助我们计算对应的相关费用, 且不需要更改客户端代码
- 而 if-else / swith 这些判断语句在添加新算法时需要在客户端添加判断, 而策略模式在添加算法时,客户端完全不需要修改