Java 设计模式_策略模式

Java 设计模式_策略模式


本文由 Luzhuo 编写,转发请保留该信息.
原文: http://blog.csdn.net/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 这些判断语句在添加新算法时需要在客户端添加判断, 而策略模式在添加算法时,客户端完全不需要修改

你可能感兴趣的:(java)