Android开发框架/库学习,设计模式之策略模式

来源:互联网 发布:比较矩阵的相似度 编辑:程序博客网 时间:2024/05/07 11:49

策略模式

在开发中,经常会碰到:一个功能有多种算法或者策略,我们根据实际需要,来选择对应的算法或者功能来开发这个功能。例如,排序算法,有很多中,但是我们只需要其中的一种来完成功能。如果我们将所有的算法或策略都放在同一个类中,那么可能会出现很多if…else if 或case等很多的判断,这样的话,这个类就会变得臃肿,不好维护。

如果将这个算法或策略包装起来,提供一个统一的接口,不同的算法或策略有不同实现的类。这也就是策略模式。

场景

深圳的公交车费用采用的不是一票制,而是采用分段计价,不同的里程对应有不同的价格。下面来进行常规写法写的代码:

public class CalculatorPrice {    private static final int BUS = 1;//公交车类型    private static final int SUBWAY = 2;//地铁    private int getBusPrice(int km) {        if (km < 6) {            return 3;        } else if (6 <= km && km < 12) {            return 5;        } else if (12 <= km && km < 20) {            return 7;        }        return 10;    }    private int getSubwayPrice(int km) {        if (km < 10) {            return 4;        } else if (10 <= km && km < 20) {            return 6;        } else {            return 8;        }    }}

调用方式:

public class Main {    public static void main(String[] args) {        CalculatorPrice calculatorPrice = new CalculatorPrice();        int type = 1;        if (type == CalculatorPrice.BUS) {            calculatorPrice.getBusPrice(15);        } else if (type == CalculatorPrice.SUBWAY) {            calculatorPrice.getSubwayPrice(10);        }    }}

这个类不是单一职责,因为在同一个类中既有计算公交车类型路费,又有计算地铁类型路费。如果说后面在增加一个出租车进来,那么又需要在这个类中增加计算出租车路费的方法,如果后面还继续增加坦克、大炮、战斗机,那么这个类就会变得臃肿难以维护难以辨别。

使用

接下来使用策略模式对其进行修改。

我们将计算的这个共性抽取出来,作为一个接口父类:

public interface Calculator {    int calculatorPrice(int km);}

然后将原来CalculatorPrice类中的计算方法分别单独抽取出来,使它们都继承自这个接口父类:

公共汽车

public class BusCalculator implements Calculator {    @Override    public int calculatorPrice(int km) {        if (km < 6) {            return 3;        } else if (6 <= km && km < 12) {            return 5;        } else if (12 <= km && km < 20) {            return 7;        }        return 10;    }}

地铁

public class SubwayCalculator implements Calculator {    @Override    public int calculatorPrice(int km) {        if (km < 10) {            return 4;        } else if (10 <= km && km < 20) {            return 6;        } else {            return 8;        }    }}

然后定义一个总的计算封装,这个类可以直接去对公交或者地铁去计算费用。

public class TranficCalculator {    private Calculator mCalculator;    public void setCalculator(Calculator calculator) {        this.mCalculator = calculator;    }    public int calculatorPrice(int km) {        return mCalculator.calculatorPrice(km);    }}

最后的调用方式:

public class Main {    public static void main(String[] args) {        TranficCalculator calculator = new TranficCalculator();        calculator.setCalculator(new BusCalculator());        System.out.print("公交车15公里资费:"+calculator.calculatorPrice(15));    }}

总结

优点:策略模式对不同的计算类型实现不同的类,使得简化计算逻辑,更加符合面对对象六大原则之一的单一职责原则。增强系统的可读性、稳定性、可扩展性。

0 0
原创粉丝点击