本文转载自 码农翻身

顺序、循环、分支,是你们所说的程序的三个基本元素。

我就是你们最常用的分支,名字叫做if语句。

今天上午,菜鸟张大胖写了一段代码:

public class Customer{private int type;......void validate(){if (type == Employee){//针对内部员工做处理}else if(type == Partner){//如果是合作伙伴,做另外的处理}         }
}

看到我没有? 在那个validate函数中,   if ...... else if ,那就是我。

张大胖写这段代码的时候其实犹豫了一下, 因为他联想到之前看到的面向对象的文章: 出现了if语句, 可以用多态来消除。

这里要不要试用多态呢?

他把疑惑给师傅Bill讲了一下, Bill说道:“暂时不用,这里的逻辑太简单了,用if else 就可以搞定,使用多态完全是多此一举!”

到了下午,菜鸟张大胖写了一个新函数: getDiscount(), 把我if ...else if 又写了一遍:

这一次,张大胖心里打鼓了: 同样的if语句在新的方法中又出现了,如果再增加新的方法,if语句还会重复 !

Bill也在一旁帮腔: 是时候用多态了。

于是张大胖定义了一个抽象类,然后让两个新的子类去继承,就把我从类中给彻底移除了:

public abstract class Customer{abstract void validate();abstract float getDiscount();......
}
public class Employee extends Customer{void validate(){//对员工类型的Customer做处理}float  getDiscount(){//对员工类型的Customer做处理}
}public class Partner extends Customer{void validate(){//对合作伙伴做处理}float  getDiscount(){//对合作伙伴做处理}
}

我很生气,这些代码中连一个If 都没有,业务逻辑都被分散到了各个具体的类中去了!

可是我转念一想: 虽然在Customer中消除了if语句,可是你总得创建具体的Customer对象吧! 创建的时候不还得使用If else ?

果然, 在OrderProcessor这个类中, 张大胖写下了下面的代码:

我哈哈大笑,我只是从Customer类被转移了到了OrderProcessor类而已,现在的代码更加凌乱了。

Bill 大惊:“大胖,可不能这么做啊,这么做重复代码更要命了,如果增加一个新的Customer的子类, 那得改多少地方啊!”

张大胖说:“那我把这些可恶的If 移到哪里去?”

“我们要提倡把对象和对象的创建分开! 对象只负责业务逻辑,对象的创建由factory, builder这些类来完成。”

public Customer createCustomer(int type,String id){if(type == Employee){return new Employee(id);}   if(type == Parnter){return new Partner(id);}......
}

Bill这个办法好厉害,一下子就把我集中关到了“工厂”小黑屋,无法分散到个各类了。

“奥,这就是设计模式中的简单工厂吧!原来集中式创建对象,好处很大啊!” 张大胖恍然大悟。

“不过,” 张大胖开始举一反三,“如果对象之间的依赖关系很复杂呢? 比如A依赖B, B依赖C.....  用factory的方式写起来也很麻烦啊!”

“你想想,能不能用声明式的方式来描述这种依赖关系,然后由某个程序自动地把这些对象给装配好?” Bill开始循循善诱。

我觉得大事不好,他们要把我放到某个通用的程序中去了。

“明白了,我们用的Spring就起到了这个作用, 在Spring当中,只要用声明的方式表达对象之间的依赖,什么构造器注入,setter方法注入,autowired等等, 然后Spring就可以自动把这些对象给装配起来,供我们使用,就不用担心创建对象的问题了。 ” 张大胖突然顿悟Spring的一个重大作用,喜不自胜。

Spring接管了对象的创建,不用在应用代码中写if语句创建对象了,但是在业务逻辑中,if语句还是跑不掉的,我下次再说说发生在那里的故事吧。

后记1:多态虽然好用,但也不能滥用!

后记2:本文受到这个视频的启发而写:https://www.youtube.com/watch?v=4F72VULWFvc

If语句:你们到底想把我放到哪儿?相关推荐

  1. 身体语言密码_“我根本不知道她到底想要什么”,《身体语言密码》告诉你

    表弟,又一次分手了. 我问他原因,他说:"我都不知道她们为什么就生气了,我都不知道她们到底想要什么". 看着表弟一脸颓丧的样子,我抛出一本<身体语言密码>:" ...

  2. 211高校导师:我到底想要什么样的研究生?

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文来源:科学网博客  作者:河北工业大学教授张光明,研究方向:水污染控制与资源化等 硕士研究生初试成 ...

  3. 工作上,我到底想要什么呢?

    最近有些迷茫,我到底想要些什么呢...... 转载于:https://www.cnblogs.com/xupeizhi/archive/2013/03/11/2954372.html

  4. 华为商店的软件可以鸿蒙,鸿蒙到底想要什么?是维护渠道的霸权还是万物互联?...

    6月2日,华为正式公布鸿蒙系统,按照华为在发布会上对外的阐述该系统是一个面向未来的OS,它的出现不是为了取代安卓系统,而是万物互联的入口. 在这个庞大的野心背后,所需要的是尽可能对于内容制作方和硬件厂 ...

  5. 英语每日一句: What’s your point? 你到底想说什么?

    今天我们要学习的一句话是:What's your point? 你到底想说什么?这句话在日常交流中很常见,当对方说了很多东西你仍不明白他到底是什么意思时,你就可以问What's your point? ...

  6. 从TP-Link到雷蛇,纷纷入局智能手机业到底想干什么?

    "眼看他起朱楼,眼看他宴宾客,眼看他楼塌了",这句形容世态炎凉的话其实与智能手机市场更为相像.诺基亚的辉煌与没落.黑莓的强势与消声无迹.摩托罗拉的数次易手.小米的横空出世与崛起.苹 ...

  7. 全新版大学英语综合教程第一册学习笔记(原文及全文翻译)——6 - What Animals Really Think(动物到底想些什么)

    Unit 6 - What Animals Really Think(动物到底想些什么) Food, warmth, sleep? Their thoughts may be much deeper ...

  8. 公司到底想要什么样的人?

    公司到底想要什么样的人? 你好,我是水巷石子,很高兴你能点进来看这篇文章,最近我也是临近毕业,忙着找工作,目前也面试了不少公司,拿到了不少offer,自己也学习了这方面的知识,我今天就来做一个分享吧, ...

  9. 你到底想要什么,通信欢迎你

    上学期,别人都回家了,白天一早就去除了导师以外见不到人的实验室,夜晚守着冷清清的宿舍,待了两周零五天,一心想着学习,每天有自己的小计划,忙活得特别特别开心,老师还教你很多东西,虽然都是最基础的,是在大 ...

最新文章

  1. 7. PowerShell -- Provider,数据操作和注册表操作
  2. c语言 lis的nlogn算法,ACM竞赛高级算法讲义.doc
  3. 计算机网络2004(模拟试题),中国矿业大学2003—2004学年(计算机网络)模拟试题 A卷...
  4. drawroundrect java_Canvas中drawRoundRect()方法介绍
  5. 江苏学考计算机,学长建议 江苏考生 位次在4000-10000 想报考计算机的同学
  6. mysql id div 1000000_Mysql数据自动ID编号,如何解决?
  7. 《深入理解Java虚拟机》第1,2章
  8. 计算数字1至10的总和
  9. .net framework 4.5安装失败
  10. 什么是技术驱动型公司?阿里算吗?
  11. SQL order by的用法
  12. 重磅:使用UOS微信桌面版协议登录,wechaty免费版web协议重放荣光
  13. TI C6000 TMS320C6678 DSP+ Zynq-7045的PS + PL异构多核案例开发手册(4)
  14. Android5g手机,这几款5G手机,入手三年不卡,不妨试一下
  15. 计算机参数配置解读,教你看懂电脑配置参数,了解组装电脑基本知识
  16. 树莓派安装中文输入法(使用的谷歌提供的树莓派系统google voice kit)
  17. streaming计算机技术,HTTP Live Streaming伪直播的设计与实现
  18. 目标检测从两阶段R-CNN系列到单阶段YOLO系列精炼
  19. docker搭建XXLjob
  20. html5骰子游戏实验报告,C++实验报告骰子游戏.doc

热门文章

  1. GitLab远程仓库迁移
  2. 独家专访 | 从跨国投行到开源社区,IBM Spark总工程师Nick Pentreath的传奇经历
  3. ToString() 会发生装箱吗?
  4. JQuery 判断checkbox是否选中,checkbox全选,获取checkbox选中值
  5. EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
  6. VC++ 中ListCtrl经验总结
  7. blender, 创建多边形面片
  8. iOS 导航栏实现总结
  9. eclipse调试报错,无法进入类
  10. IOS开发之——颜色设置