前言

人在IT江湖飘,不懂设计模式咋装X?

我们这个社会上的事情大概率都符合八二法则,软件领域也一样。例如你学习一门编程语言,工作中常用的类来来回回也就那么几十个。那么多设计模式,最常被人使用的也就那么几种,所以我们在做事情的时候应该首先着眼于那20%。

策略模式算是设计模式中简单而又常用的了。

定义

策略模式定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换。

使用场景

当你写代码的时候发现一个操作有好多种实现方法,而你需要根据不同的情况使用if-else等分支结构来确定使用哪种实现方式的时候,想一想这个模式。

如何实现

业务场景

2017年的2月14号,王二狗和牛翠花约好在天津之眼约定终身,二狗打扮一番后准备出发,此时问题来了:是坐公交去呢,还是打滴滴快车呢?天气看起来也不错,要不骑共享单车吧,省钱还锻炼身体。

对应到编程领域就是:目前有三种策略可以实现一个特定的目的,使用何种策略取决于调用者(客户端)

普通实现

如果我们正常写代码,平时也应该这样,首先保证把功能正确的实现了,然后慢慢重构,设计模式都是在不断的重构当中应用的。 王二狗会调用会调用goToTianJinEye()方法,根据自己的实际情况,选择某一种出行方式。

public class TrafficFeeCalculator {

public int goToTianJinEye(String way, int distance) {

int trafficFee = 0;

switch (way) {

case "bus":

if (distance < 10)

trafficFee = 4;

else

trafficFee = 6;

break;

case "didi":

if(distance<3)

trafficFee = 8;

else

trafficFee=8+(distance-3)*3;

break;

case "sharedBicyle":

trafficFee = 2;

break;

default:

break;

}

return trafficFee;

}

}

那么这么写有什么弊端呢?

第一:每一种出行方式的交通花费的计算方式都写在了TrafficFeeCalculator类中,这个类承担的职责较多,违反了单一职责原则。

第二:假如王二狗突然想自己开车去,那就需要修改goToTianJinEye这个方法了。违反了开闭原则。

使用策略模式

以上的场景非常适合使用策略模式,将多种不同的实现算法封装,然后客户端根据不同策略分别调用相应的算法。

第一步:封装不同的实现算法

首先定义一个策略接口,规定算法的同一操作

public interface CalculateStrategy {

int calculateTrafficFee(int distance);

}

第二步:封装各个算法

//乘坐公交车算法

public class ByBus implements CalculateStrategy {

@Override

public int calculateTrafficFee(int distance) {

return distance<10?4:6;

}

}

//乘坐滴滴快车算法

public class ByDiDiExpress implements CalculateStrategy {

@Override

public int calculateTrafficFee(int distance) {

return distance<3?8:(8+(distance-3)*3);

}

}

//骑共享单车算法

public class BySharedBicycle implements CalculateStrategy {

@Override

public int calculateTrafficFee(int distance) {

return 2;

}

}

第三步:使用算法

public class TrafficFeeCalculator {

...

public int goToTianJinEye(CalculateStrategy strategy,int distance){

return strategy.calculateTrafficFee(distance);

}

}

第四步:客户端调用

根据情况,构建相应的算法类实例,传入计算器计算即可

public static void main(String[] args) {

TrafficFeeCalculator calculator=new TrafficFeeCalculator();

System.out.println(String.format("乘坐公交车到天津之眼的花费为:%d块人民币",

calculator.goToTianJinEye(new ByBus(),10)));

System.out.println(String.format("乘坐滴滴快车到天津之眼的花费为:%d块人民币",

calculator.goToTianJinEye(new ByDiDiExpress(),10)));

System.out.println(String.format("骑共享单车到天津之眼的花费为:%d块人民币",

calculator.goToTianJinEye(new BySharedBicycle(),10)));

}

输出为:

乘坐公交车到天津之眼的花费为:6块人民币

乘坐滴滴快车到天津之眼的花费为:29块人民币

骑共享单车到天津之眼的花费为:2块人民币

二狗为了早点见到自己心爱的牛翠花,最终选择了滴滴快车,贵是贵了点,但是快!

优缺点

优点:降低了算法类的职责,使各个算法可以独立变化并互相替换。而且使得增加新的算法变的很容易,降低了对原有系统的侵入,最终使得程序可扩展可维护性增强。

缺点:所有设计模式的通病,类增多了,程序从局部来看变的更复杂了。

总结

是不是感觉讲设计模式的文章都有一个特点,使用了设计模式反而比不使用设计模式使程序看起来更加复杂,而不是更加简单。那是因为每篇文章的示例都是无实际使用意义的示例代码,实际情况是程序非常复杂才需要使用到设计模式。一个大型程序是不断迭代出来的,一开始肯定不长那样,程序员日常接到一个开发任务也不要过多的想,这个我应该用个什么设计模式呀?先把功能实现了,然后回头看看有没有遵循面向对象编程6大原则,如果没有想想怎么改进,然后设计模式就登场了。。。

设计模式值得你刻意练习!

本文同步分享在 博客“ShuSheng007”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

android 策略模式和代理模式,秒懂设计模式之策略模式(Strategy Pattern)相关推荐

  1. java策略模式详解_Java经典设计模式之策略模式原理与用法详解

    本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...

  2. 【秒懂设计模式】原型模式

     秒懂设计模式--原型模式 (五)原型模式 [官方定义]用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象,属于对象创建模式. [举例]在找工作的时候,通常需要我们的毕业证和学位证,但是 ...

  3. 【图解设计模式系列】The Strategy Pattern: 策略模式

    当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为.讲这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句.(大概的意思就是说 我们要多多利用多态 而 ...

  4. java实现责任链模式_我的Java设计模式-责任链模式

    今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...

  5. java备忘录模式 类图,【java设计模式】备忘录模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述备忘录(Memento)模式的: 备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是对象的行为模式. 备忘录 ...

  6. 秒懂设计模式之组合模式(Composite Pattern)

    [版权申明] 非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/116378002 出自:shusheng0 ...

  7. 秒懂设计模式之状态模式(State Pattern)

    [版权申明] 非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/116375477 出自:shusheng0 ...

  8. Android常考问题(8)-设计模式:Builder模式(顺带学习了一下String的比较和final)

    今天的主要目的是学习设计模式中的Builder模式.由于java基础不牢固,在学习过程中要回过头去学习java内容,因此凑成了这样一篇驳杂的文章. Builder模式 首先是Builder设计模式的作 ...

  9. 秒懂设计模式之命令模式(Command Pattern)

    [版权申明] 非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/116115743 出自:shusheng0 ...

  10. glide源码中包含了那种设计模式_秒懂设计模式之建造者模式(Builder pattern)

    更新于2020年10月20日 没想到这篇设计模式的文章引起了如此多小伙伴的兴趣,本人近来一直在使用kotlin,某天突然好奇当Builder模式遇到Kotlin会怎样,还有爱吗,欢迎好学的小伙伴一起探 ...

最新文章

  1. UNITY把3D模型显示在UI层级上的思路
  2. [gic]-中断虚拟化-Host和Guest的中断处理流程举例(gicv3举例)
  3. OpenCASCADE:物理STEP文件
  4. 关于PHP程序员解决问题的能力
  5. html中字段是日期控件,jQuery日历插件datepicker用法详解
  6. SAP Spartacus里所有backend endpoint list
  7. spring mvc学习(40):restful的crud实现增加方式
  8. ECC 公钥加密 使用相同的ECC公钥对 对 相同的数据进行加密,每次的加密结果是一致的吗?
  9. 查看openssh版本_OpenSSH命令注入漏洞复现(CVE202015778)
  10. Win10升级惹的祸,Oracle服务全没有了,怎么解决?
  11. Filebeat 5.x 日志收集器 安装和配置
  12. 【勒索病毒数据恢复】Phobos勒索病毒家族之.[back23@vpn.tg].makop
  13. Eyoucms易优小程序插件2.0版本上线
  14. 图片默认底部3px缝隙
  15. 计算机考试怎样切换输入法,高级会计师考场如何切换输入法?
  16. 我们上市了-taofen8-返利界最美的云彩
  17. 神舟精盾 t97 键盘背光灯如何设置亮的时间
  18. CAN(Controller Area Network)网络通信简介
  19. 大数据专业毕业后前景如何?能做什么职位?
  20. 培训官赵敏:学员就是我们的产品[摘自上海科技报]

热门文章

  1. 职称论文通过查重之后就能发表吗?
  2. iOS【UIDynamic重力、弹性碰撞吸附等现象】
  3. Python求极限求积分,编程实现
  4. 伺服舵机匀加速和匀减速程序控制
  5. 首月流水2.39亿美元,《原神》的发行策略是什么?
  6. 分布式系统如何保证数据一致性
  7. 程序员不得不了解的硬核知识大全
  8. HTML中的三目表达式可以有多长
  9. 对AD采样信号的简单滤波处理
  10. 转录组-蛋白组-代谢组关联分析