策略模式学习
来源:互联网 发布:w7本地连接未识别网络 编辑:程序博客网 时间:2024/06/05 03:12
我们在解决一个问题有多种方案的时候最简单的方式就是通过if-esle或者switch-case方法我们来个简单的实例:在2014年12月28号,北京提高公交价格, 不再是单一票价制,采用分段制,公交和地铁价格的计算方式也不一样.我们就来计算乘坐不同工具的成本
开始撸代码
public class PriceCalculator { public static final int BUS = 1; public static final int SUBWAY = 1; public static void main(String[] args) { } /** * 北京公家车, 十公里之内一元钱,超过十公里之后每加一公里可以乘坐5公里 * @param km * @return */ private int busPrice(int km) { //超过十公里的总距离 int extraTal = km - 10; //超过的距离是5公里的倍数 int extraFactor = extraTal / 5; //超过5公里取余 int fraction = extraTal % 5; //价格计算 int price = 1 + extraFactor * 1; return fraction > 0 ? ++price : price; } /** * 6公里(含)内3元;6~12(含)4元;12~22(含)5元;22~32(含)6元; * @param km * @return */ private int subWayPrice(int km) { if (km <= 6) { return 3; } else if (km > 6 && km <= 12) { return 4; } else if (km > 12 && km <= 22) { return 5; } else if (km > 22 && km < 32) { return 6; } return 7; } private int calculatePrice(int km, int type) { if (type == BUS) { return busPrice(km); } else if (type == SUBWAY) { return subWayPrice(km); } return 0; }}
我想刚开始我们都会这么写 很简单, 看下这个类承担了计算公交车和地铁价格的问题;不是单一职责,另一个问题就是通过if-else来判断哪种计算形式.当我们增加一种出行方式的时候,我们就要写一个方法来计算, 而且还要在calculatePrice(int km, int type)方法中增加一个判断
用策略模式进行重构
计算接口
public interface CalculateStrategy { /** * 按距离来计算价格 * @param km 公里 * @return 返回价格 */ int calculatePrice(int km);}
公交车计算策略
public class BusStrategy implements CalculateStrategy { @Override public int calculatePrice(int km) { //超过十公里的总距离 int extraTal = km - 10; //超过的距离是5公里的倍数 int extraFactor = extraTal / 5; //超过5公里取余 int fraction = extraTal % 5; //价格计算 int price = 1 + extraFactor * 1; return fraction > 0 ? ++price : price; }}
地铁计算策略
public class SubwayStrategy implements CalculateStrategy { @Override public int calculatePrice(int km) { if (km <= 6) { return 3; } else if (km > 6 && km <= 12) { return 4; } else if (km > 12 && km <= 22) { return 5; } else if (km > 22 && km < 32) { return 6; } return 7; }}
管理类
public class TranficCalcultaor { CalculateStrategy mCalculateStrategy; public void setStrategy(CalculateStrategy calculateStrategy) { mCalculateStrategy = calculateStrategy; } public int calculatePrice(int km) { return mCalculateStrategy.calculatePrice(km); }}
使用
public static void main(String[] args) { TranficCalcultaor tranficCalcultaor = new TranficCalcultaor(); tranficCalcultaor.setStrategy(new BusStrategy()); int i = tranficCalcultaor.calculatePrice(16); System.out.println(i+"===============");}
安卓系统中用到策略模式的有:时间插值器
0 0
- 策略模式的学习
- 策略模式的学习
- 策略模式学习
- 策略模式学习案例
- 学习日记-策略模式
- 策略模式学习笔记
- 策略模式学习笔记
- 策略模式学习1
- 策略模式学习2
- 策略模式学习
- 策略模式学习
- 策略模式--设计模式学习
- 设计模式学习----策略模式
- 学习设计模式-----策略模式
- 【设计模式】策略模式学习
- 设计模式学习-----策略模式
- 设计模式学习------策略模式
- 设计模式学习--策略模式
- shell 脚本简单txt文本数据操作
- vim 使用(1)
- listview和button冲突
- Unity3D中float的精度和最大值
- Scatter file基础和应用实例
- 策略模式学习
- RCNN学习笔记(0):rcnn简介
- W88 Online Casino Earn Highest 1.1% Rebate Bonus(Earn Highest 1.1%, Rebate Bonus, w88, W88 Online Ca
- Presentation 常用的承接句——技术分享、学术报告串联全场不尴尬
- thinkphp 自动完成在自动验证unique时失效的解决方法
- Spring中的JDBC操作
-  |"|&|<|>等html字符转义
- Android Https请求调用
- Mybatis环境配置