白话控制反转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) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...
随机推荐
- python 时间和时间戳的转化
时间戳与时间之间的转换,需要一个中间过程,即将先将时间或时间戳先转为时间元组! 1.时间转时间戳: import datetime, time s = datetime.datetime(2016,6 ...
- 线程锁的本质:线程控制、线程状态控制 while if:根据线程的关系(模式)协调线程的执行
线程锁的本质:线程控制.线程状态控制 while if https://www.cnblogs.com/feng9exe/p/8319000.html https://www.cnblogs.com/ ...
- 「LG2664 树上游戏」
题目 这真是一道神仙的一批的题目 定义\(s(i,j)\)表示从点\(i\)到点\(j\)经过的颜色数量 设 \[sum_i=\sum_{j=1}^ns(i,j)\] 求出所有的\(sum_i\) 考 ...
- PHP读取文件内容的五种方式(转载)
php读取文件内容的五种方式 分享下php读取文件内容的五种方法:好吧,写完后发现文件全部没有关闭.实际应用当中,请注意关闭 fclose($fp); php读取文件内容: -----第一种方法--- ...
- Linux学习总结(一) windos环境vmware安装centos7
一.在这里我先简单介绍下虚拟化技术[即在一台电脑上虚拟出子系统,而且可能需要多台服务器进行工作,一般都是linux系统做服务器或者学习研究之用], 二来我们可以有效利用一台pc的资源模拟出终端远程访问 ...
- 关于Git学习推荐
Git学习除了推荐官方网站:https://git-scm.com/之外, 我个人比较推荐初学者或者被动使用者可以学习参考廖雪峰的这个教程:https://www.liaoxuefeng.com/wi ...
- 浅谈sql之连接查询
SQL之连接查询 一.连接查询的分类 sql中将连接查询分成四类: 内链接 外连接 左外连接 右外连接 自然连接 交叉连接 二.连接查询的分类 数据库表如下: 1.学生表 2.老师表 3.班级表 表用 ...
- hdu 1010(迷宫搜索,奇偶剪枝)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1010 Tempter of the Bone Time Limit: 2000/1000 MS (Ja ...
- C#发送邮件类库
public class Email { #region 发送邮件 /// <summary> /// 发送邮件 /// </summary> /// <param na ...
- Layered Architecture 分层架构
分层的价值在于每一层都只代表程序中的某一特定方面.这种限制使每个方面的设计都更具有内聚性,更容易解释. 大多数成功的架构使用的都是包括下面这四个概念层的某个版本