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
- Android开发框架/库学习,设计模式之策略模式
- Android开发框架/库学习,设计模式之工厂模式
- Android框架基础之策略设计模式
- Android开发框架/库学习,设计模式之建造者模式
- android应用开发设计模式之策略模式
- android应用开发设计模式之策略模式
- 学习设计模式之--------策略模式
- 设计模式之策略模式学习
- 设计模式学习笔记之策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习之策略模式
- 设计模式学习之路-----策略模式
- 设计模式之策略模式学习
- 学习:设计模式之策略模式
- 设计模式学习之策略模式
- 学习篇:设计模式之策略模式
- 设计模式之策略模式的学习
- java设计模式学习之策略模式
- 【linux kernel 3.18】I2C总线驱动注册、注销和使用流程
- 前端学习入门(一)
- Retrofit2 multpart多文件上传详解
- UVa815洪水
- 编译链接动态链接库生成调用
- Android开发框架/库学习,设计模式之策略模式
- Hive重点知识点总结
- Android Camera的简单使用浅析
- c++头文件的编写
- 第3章 认识HDFS习题
- 一看就懂系列之 如何实现与控制php常驻进程
- Android设计模式 -- 单例模式总结
- 牛顿法
- 随机过程及应用(二) - E[X|Y] = E[Y E[X|Y]]证明