白话控制反转IoC及其应用
控制反转(IoC, Inversion of Control),依赖注入(DI, Dependency Injection)是在面向对象编程中经常碰到的专业术语。很多朋友可能在百度之后,便浅尝辄止,没有深入理解这两种思想的精髓。我们在查找IoC的含义的过程中,可能 见过这句通俗的解释:你呆着别动,到时我会找你。这句解释到底应该如何去理解呢?下面,我们结合具体的业务场景和其实现方式的研究,来对IoC以及DI做一个比较详细的解释,希望能够对初学者有所启发。
一. 一个常见的业务场景
在移动互联网APP中,几乎都要使用推送信息的功能,如:我们经常会在周五晚上收到APP的推送消息,这样的消息形式包括APP自有推送(通知栏),短信推送(短信中的通知类消息,有可能被过滤),邮件推送,微信推送,甚至以后还可能拓展到穿戴式设备推送,消息的形式非常丰富。而推送的消息中,主要是一些商品推荐类,内容推荐类或者系统通知类的内容。假定现在公司要你负责这部分推送功能的架构和实现,你应该如何去设计呢?
这个业务场景可以说在每个移动互联网公司都会遇到。假如该公司的名称为XM,负责实现该部分功能的小组中有三位研发成员,分别是:小A,小B和小C。如何对该功能系统进行整体架构,使得开发效率最高?我们可以围绕以下几个问题,进行逐步探讨:
- 如果只实现短信推送的功能,如何设计和实现?
- 怎么使系统保持可扩展性,减少研发人员的修改工作?
- 可以彻底省去对代码的修改吗?
我们围绕这三个具体的问题,来一步步实现和改进我们的系统。
二. 功能的设计实现与改进
2.1 程序实现V1.0
首先,短信推送的功能,要今天晚上开发上线。三个人一听就慌了,还有五个小时,顾不上考虑那么多了,先把功能开发出来再说。于是,三个人经过简单的讨论,将系统的实现架构设计如下:

根据系统设计,分工如下:由小A负责业逻辑控制模块LogicController的开发,此处简化为XM.LogicController.exe;由小B负责推送消息管理(PushMsgService),并集成到组件 XM.MsgService.dll中;由小C负责短信功能帮助类(SMSHelper),并提供组件XM.SMS.dll。
根据以上的设计和分工,不到一个小时,功能便做出来了。各自的代码如下:
小C的短信功能帮助类核心代码:
public class SMSHelper
{
public void Send(string message)
{
Console.Write("From SMS: " + message);
}
}
小B的消息管理模块核心代码如下:
public class PushMsgService
{
SMSHelper pushTool; public PushMsgService()
{
pushTool = new SMSHelper();
} public void Push(string message)
{
pushTool.Send(message);
}
}
小A的业务集成模块的核心代码如下:
string message = "今日特价:创意城绿茶餐厅30元4人餐";
MsgService.PushMsgService service = new MsgService.PushMsgService();
service.Push(message);
三个人经过短暂的拼搏,终于完成了任务,顺利上线了产品。做完之后,三个人洋洋得意的push了代码,一块去街边撸串去了。当日,系统运行良好,无任何bug出现。第二天,相应的功能被移植到了公司的其他部门。如:后台编辑部开发的推送管理系统,也需要此功能;运营部开发的产品推荐系统,也需要此功能;人力资源部门的招聘管理系统,也需要此功能。短信消息推送的功能,在各个部门里面,被广泛的应用,都是采用ABC开发的这一套库去做的实现。
2.2 程序实现V2.0
有天,跟XM合作的短信服务商突然提高了合作的价格,每条短信要多收1分钱。于是,部门经理当机立断:立即研发自有推送功能。除非客户所处的地区网络及其不好,否则,一律采用自有推送功能进行消息推送。
接到这个需求之后,ABC便马不停蹄的开始工作了。不过,这次他们有点头疼了,因为他们之前的代码不仅在自己部门使用,而且在编辑部,运营部,人力资源部都有被使用。如果要修改,难道我要一个个去各个部门修改吗?怎么样使得此处的变化,产生最小的影响呢?这就是我们要研究的第二个问题。
白话控制反转IoC及其应用的更多相关文章
- 控制反转IoC简介
控制反转IoC简介 在实际的应用开发中,我们需要尽量避免和降低对象间的依赖关系,即降低耦合度.通常的业务对象之间都是互相依赖的,业务对象与业务对象.业务对象与持久层.业务对象与各种资源之间都存在这样或 ...
- 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路
开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...
- 控制反转IOC的依赖注入方式
引言: 项目中遇到关于IOC的一些内容,因为和正常的逻辑代码比较起来,IOC有点反常.因此本文记录IOC的一些基础知识,并附有相应的简单实例,而在实际项目中再复杂的应用也只是在基本应用的基础上扩展而来 ...
- 控制反转IOC与依赖注入DI
理解 IOC http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC 相关实例 的http:// ...
- 控制反转(Ioc)和依赖注入(DI)
控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...
- 控制反转IOC与依赖注入DI【转】
转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...
- 依赖注入(DI)和控制反转(IOC)
依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...
- iOS控制反转(IoC)与依赖注入(DI)的实现
背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大 ...
- 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解
一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...
随机推荐
- Javascript 中 Array的 sort()和 compare()方法
Javascript 中 Array的 sort()方法其实是把要排序的内容转化为string(调用 toString()), 然后按照字符串的第一位 ascii 码先后顺序进行比较,不是数字. 我们 ...
- 【转】Spring Boot Profile使用
http://blog.csdn.net/he90227/article/details/52981747 摘要: spring Boot使用@Profile注解可以实现不同环境下配置参数的切换,任何 ...
- async--ajax异步传输
如图:轨迹点组编号依赖所属路口的设置. 所以ajax是异步执行,获取到所属路口还没执行完,就已经执行到根据所述路口获取轨迹点组编号,所以获取不到轨迹点组编号. async:false改成同步执行.就没 ...
- QGis 利用Python Console编写脚本进行批量处理
前言 这篇文章里,我们要完成一些数据的合并,计算等操作. 准备工作 首先要了解Qgis的编程模型,具体参考文章<QGIS里的编程模型>及<Qgis里的查询过滤>.了解了Qgis ...
- javascript中filter方法
array1.filter(callbackfn[, thisArg]) 參數 參數 定義 array1 必要項. 陣列物件. callbackfn 必要項. 最多接受三個引數的函式. filte ...
- Oracle split分区表引起ORA-01502错误
继上次删除分区表的分区遇到ORA-01502错误后[详细见链接:Oracle分区表删除分区引发错误ORA-01502: 索引或这类索引的分区处于不可用状态],最近在split分区的时候又遇到了这个问题 ...
- 我的前端工具集(六)Ajax封装token
我的前端工具集(六)Ajax封装token liuyuhang原创,未经允许禁止转载 在单点登陆中,或登陆验证后,不应该每次都验证用户名和密码, 也不应该将用户名密码存入cookie中(虽然很多都 ...
- Zabbix——设置报警阈值
前提条件: 1. Zabbix-server 版本为4.0 2.邮件告警正常使用 3. 阈值改为1分钟进行邮件发送 点击: 找到agent,点击触发器: 设置网络ping包进行检测
- window下使用Composer安装yii2
1.在 Windows 中,先下载并运行 Composer-Setup.exe,安装过程需选择php的运行目录,安装完后在windows的cmd下运行composer看看是否安装成功 2.安装完Com ...
- 纯JS实现轮播图特效——详解
<div id="slider"> <div id="sliderImgs"> <img src="img/mi04.j ...