控制反转(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及其应用的更多相关文章

  1. 控制反转IoC简介

    控制反转IoC简介 在实际的应用开发中,我们需要尽量避免和降低对象间的依赖关系,即降低耦合度.通常的业务对象之间都是互相依赖的,业务对象与业务对象.业务对象与持久层.业务对象与各种资源之间都存在这样或 ...

  2. 浅析“依赖注入(DI)/控制反转(IOC)”的实现思路

    开始学习Spring的时候,对依赖注入(DI)——也叫控制反转(IOC)—— 的理解不是很深刻.随着学习的深入,也逐渐有了自己的认识,在此记录,也希望能帮助其他入门同学更深入地理解Spring.本文不 ...

  3. 控制反转IOC的依赖注入方式

    引言: 项目中遇到关于IOC的一些内容,因为和正常的逻辑代码比较起来,IOC有点反常.因此本文记录IOC的一些基础知识,并附有相应的简单实例,而在实际项目中再复杂的应用也只是在基本应用的基础上扩展而来 ...

  4. 控制反转IOC与依赖注入DI

    理解 IOC  http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC 相关实例      的http:// ...

  5. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...

  6. 控制反转IOC与依赖注入DI【转】

    转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...

  7. 依赖注入(DI)和控制反转(IOC)

    依赖注入(DI)和控制反转(IOC) 0X1 什么是依赖注入 依赖注入(Dependency Injection),是这样一个过程:某客户类只依赖于服务类的一个接口,而不依赖于具体服务类,所以客户类只 ...

  8. iOS控制反转(IoC)与依赖注入(DI)的实现

    背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大 ...

  9. 个人对【依赖倒置(DIP)】、【控制反转(IOC)】、【依赖注入(DI)】浅显理解

    一.依赖倒置(Dependency Inversion Principle) 依赖倒置是面向对象设计领域的一种软件设计原则.(其他的设计原则还有:单一职责原则.开放封闭原则.里式替换原则.接口分离原则 ...

随机推荐

  1. luogu3368树状数组模板2

    题目链接:https://www.luogu.org/problemnew/show/P3368 题意:与模板1不同的是这题的操作是树状数组并不在行的区间更新和单点查找,如果按照模板1那样写肯定会T. ...

  2. PHP 中的 cURL 爬虫实战基础

    最近准备入手 PHP 爬虫,发现 PHP 的 cURL 这一知识点不可越过.本文探讨基础实战,需要提前了解命令行的使用并会进行 PHP 的环境搭建. cURL 的概念 cURL,Client URL ...

  3. 8.spring:事务管理(上):Spring的数据库编程、编程式事务管理

    Spring的数据库编程 Spring框架提供了JDBC模板模式------>JdbcTemplate 简化了开发,在开发中并不经常是使用 实际开发更多使用的是Hibernate和MyBatis ...

  4. Selenium基础知识(元素定位的调试)

    对一个不能直接定位的元素来说,调试是很常见的事,所以这里也简单总结了一下. 调试定位元素的工具很多,介绍也多,就不一一介绍了.下次有时间再补充.以下是我常用调试的方法(浏览器自带的控制台调试,仅介绍一 ...

  5. 记录一下xcode9 添加文件夹的顺序

    右击->Add Files to YourProject->弹出文件对话框,点击Options->选择:Copy Items if needed和Create Groups 要选择O ...

  6. String.format字符串拼接

    一.String.Format1.简介      String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. 2.参数      format()方法有两种重载形式. form ...

  7. 删除oracle实例

    1.在开始菜单中,点击ORAHOME目录下的"Configuration and Migration Tools"下的"Database Configuration As ...

  8. mysql的入门基本使用(适合新手学习)

    登陆Mysql数据库mysql -u root -p 展示(查询)所有数据库show databases;进入数据库use dataname;创建数据库create database dataname ...

  9. ffmpeg教程

    转:http://blog.sina.com.cn/s/blog_51396f890100nd91.html 概要  电影文件有很多基本的组成部分.首先,文件本身被称为容器Container,容器的类 ...

  10. 【VS插件】Highlight all occurrences of selected word

    这个插件可以让相同的单词全部高亮成绿色,在VS中看一些文本(比如SQL)类型的文件时非常好用. 类似于这种效果: