C++设计模式中控制反转与依赖注入浅析

目录
  • 控制反转
  • 依赖注入(DI)
  • 依赖注入框架(DI Framework)
  • 依赖反转原则(DIP)

控制反转

“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。在使用框架之后,整个程序的执行流程可以通过框架来控制。流程的控制权从程序员“反转”到了框架。

大白话说,就是原先直接用main函数中的代码流程,转移到了框架中去。

#include <iostream>
#include <list>
using namespace std;
class TestCase
{
public:
	TestCase() {};
	~TestCase() {};
	virtual int test() = 0;
	void run()
	{
		switch (test())
		{
		case 1:cout << "1\ test() " << endl; break;
		case 2:cout << "2\ test() " << endl; break;
		default:
			break;
		}
	}
};
class Cases : public TestCase
{
	virtual int test() override
	{
		return 1;
	}
};
class Dases : public TestCase
{
	virtual int test() override
	{
		return 2;
	}
};
class Application
{
public:
	void registers(TestCase *cases)
	{
		testCases.push_back(cases);
	}
	void runStage()
	{
		for (auto&it : testCases)
		{
			it->run();
		}
	}
private:
	list<TestCase*> testCases;
};
int main()
{
    std::cout << "Hello World!\n";
	TestCase *case1 = new Cases();
	TestCase *dase1 = new Dases();
	Application app;
	app.registers(case1);
	app.registers(dase1);
	app.runStage();
}

依赖注入(DI)

什么是依赖注入呢?

概括就是:不通过 new() 的方式在类内部创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类使用。

class Message
{
public:
	virtual void send(string msg) = 0;
};
class phoneMessage : public Message
{
public:
	virtual void send(string msg) override
	{
		cout << "this is phone msg : " << msg.c_str() << endl;
	}
private:
};
class NotifyIterface
{
public:
	NotifyIterface(Message *obj)
	{
		message = obj;
	}
	void sendMsg(string msg)
	{
		message->send(msg);
	}
private:
	Message *message;
};
class MessageSender
{
public:
	void sender(string msg)
	{
		cout << msg.c_str() << endl;
	}
};
//非依赖注入
class Notification
{
public:
	Notification()
	{
		msgsender = new MessageSender();
	}
	void sendMsg(string msg)
	{
		msgsender->sender(msg);
	}
private:
	MessageSender *msgsender;
};
//依赖注入
class Notification2
{
public:
	Notification2(MessageSender *obj)
	{
		msgsender = obj;
	}
	void sendMsg(string msg)
	{
		msgsender->sender(msg);
	}
private:
	MessageSender *msgsender;
};
int main()
{
	//非依赖注入的写法
	Notification *notify = new Notification();
	notify->sendMsg("this is not DI");
	//依赖注入的写法,通过依赖注入的方式来将依赖的类对象传递进来,这样就提高了代码的扩展性
	MessageSender *msgobj = new MessageSender();
	Notification2 *notify2 = new Notification2(msgobj);
	notify2->sendMsg("this is DI");
	//依赖注入,改为通过接口实现
	Message *message = new phoneMessage();
	NotifyIterface *notifyIterface = new NotifyIterface(message);
	notifyIterface->sendMsg(" Iphone !");
}

依赖注入框架(DI Framework)

在采用依赖注入实现的 Notification 类中,虽然我们不需要用类似 hard code 的方式,在类内部通过 new 来创建 MessageSender 对象,但是,这个创建对象、组装(或注入)对象的工作仅仅是被移动到了更上层代码而已,还是需要我们程序员自己来实现。

对象创建和依赖注入的工作,本身跟具体的业务无关,我们完全可以抽象成框架来自动完成。

实际上,现成的依赖注入框架有很多,比如 Google Guice、Java Spring、Pico Container、Butterfly Container 等。不过,如果你熟悉 Java Spring 框架,你可能会说,Spring 框架自己声称是控制反转容器(Inversion Of Control Container)。

不过这一块儿的东西先做了解,具体的实现需要自己想一想再去实现。

依赖反转原则(DIP)

高层模块(high-level modules)不要依赖低层模块(low-level)。高层模块和低层模块应该通过抽象(abstractions)来互相依赖。除此之外,抽象(abstractions)不要依赖具体实现细节(details),具体实现细节(details)依赖抽象(abstractions)。

所谓高层模块和低层模块的划分,简单来说就是,在调用链上,调用者属于高层,被调用者属于低层。在平时的业务代码开发中,高层模块依赖底层模块是没有任何问题的。

依赖反转原则也叫作依赖倒置原则。这条原则跟控制反转有点类似,主要用来指导框架层面的设计。高层模块不依赖低层模块,它们共同依赖同一个抽象。抽象不要依赖具体实现细节,具体实现细节依赖抽象。

到此这篇关于C++设计模式中控制反转与依赖注入浅析的文章就介绍到这了,更多相关C++控制反转与依赖注入内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++依赖倒转原则和里氏代换原则有什么好处

    初学依赖倒转原则和里氏代换原则时,由于笔者水平有限,并没有看懂书上的专业术语的解释,经过反复摸索和学习,发现里氏代换原则和依赖倒转原则可以一言以蔽之: 里氏代换原则:开发时以抽象为核心,针对抽象编程,能够抽象为一个抽象类或者接口的,就将其抽象为抽象类或者接口,然后用子类来进行实现 依赖倒转原则:将代码分为3层考虑,业务逻辑层,抽象层和实现层,其中业务逻辑层依赖抽象层,实现层也依赖抽象层 那么在代码中使用依赖倒转原则和里氏代换原则有什么好处吗? 只要能抽象你就进行抽象,然后不管高层模块(业务逻辑层

  • C++设计模式中控制反转与依赖注入浅析

    目录 控制反转 依赖注入(DI) 依赖注入框架(DI Framework) 依赖反转原则(DIP) 控制反转 “控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行.在使用框架之后,整个程序的执行流程可以通过框架来控制.流程的控制权从程序员“反转”到了框架. 大白话说,就是原先直接用main函数中的代码流程,转移到了框架中去. #include <iostream> #include <list> using namespace std

  • Spring 控制反转和依赖注入的具体使用

    目录 控制反转的类型 1.依赖查找 1.1依赖拉取 1.2上下文依赖查找 2.依赖注入 2.1构造函数注入 2.2setter函数注入 Spring中的控制反转 1.Bean和BeanFactory 2.设置Spring配置 2.1XML配置 2.2注解配置 2.3Java配置 3.setter注入 4.构造函数注入 控制反转的类型 控制反转(IOC)旨在提供一种更简单的机制,来设置组件的依赖项,并在整个生命周期管理这些依赖项.通常,控制反转可以分成两种子类型:依赖注入(DI)和依赖查找(DL)

  • 实例讲解Java的Spring框架中的控制反转和依赖注入

    近来总是接触到 IoC(Inversion of Control,控制反转).DI(Dependency Injection,依赖注入)等编程原则或者模式,而这些是著名 Java 框架 Spring.Struts 等的核心所在.针对此查了 Wikipedia 中各个条目,并从图书馆借来相关书籍,阅读后有些理解,现结合书中的讲解以及自己的加工整理如下: eg1 问题描述: 开发一个能够按照不同要求生成Excel或 PDF 格式的报表的系统,例如日报表.月报表等等.   解决方案: 根据"面向接口编

  • Javascript技术栈中的四种依赖注入详解

    作为面向对象编程中实现控制反转(Inversion of Control,下文称IoC)最常见的技术手段之一,依赖注入(Dependency Injection,下文称DI)可谓在OOP编程中大行其道经久不衰.比如在J2EE中,就有大名鼎鼎的执牛耳者Spring.Javascript社区中自然也不乏一些积极的尝试,广为人知的AngularJS很大程度上就是基于DI实现的.遗憾的是,作为一款缺少反射机制.不支持Annotation语法的动态语言,Javascript长期以来都没有属于自己的Spri

  • Web API中使用Autofac实现依赖注入

    一.创建实体类库 创建单独实体类 创建DI.Entity类库,用来存放所有的实体类,新建用户实体类,其结构如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DI.Entity { public class UserEntity { public int UserId { get; set;

  • Android应用开发中控制反转IoC设计模式使用教程

    1.概述 首先我们来吹吹牛,什么叫IoC,控制反转(Inversion of Control,英文缩写为IoC),什么意思呢? 就是你一个类里面需要用到很多个成员变量,传统的写法,你要用这些成员变量,那么你就new 出来用呗~~ IoC的原则是:NO,我们不要new,这样耦合度太高:你配置个xml文件,里面标明哪个类,里面用了哪些成员变量,等待加载这个类的时候,我帮你注入(new)进去: 这样做有什么好处呢?  回答这个问题,刚好可以回答另一个问题,很多人问,项目分层开发是吧,分为控制层.业务层

  • Javascript技术栈中的四种依赖注入小结

    作为面向对象编程中实现控制反转(Inversion of Control,下文称IoC)最常见的技术手段之一,依赖注入(Dependency Injection,下文称DI)可谓在OOP编程中大行其道经久不衰.比如在J2EE中,就有大名鼎鼎的执牛耳者Spring.Javascript社区中自然也不乏一些积极的尝试,广为人知的AngularJS很大程度上就是基于DI实现的.遗憾的是,作为一款缺少反射机制.不支持Annotation语法的动态语言,Javascript长期以来都没有属于自己的Spri

  • asp.net中控制反转的理解(文字+代码)

    对IOC的解释为:"Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels." 我想对这一概念执行 一个个人的阐述,以方便

  • 详解ASP.NET Core 中的框架级依赖注入

    1.ASP.NET Core 中的依赖注入 此示例展示了框架级依赖注入如何在 ASP.NET Core 中工作. 其简单但功能强大,足以完成大部分的依赖注入工作.框架级依赖注入支持以下 scope: Singleton - 总是返回相同的实例 Transient - 每次都返回新的实例 Scoped - 在当前(request)范围内返回相同的实例 假设我们有两个要通过依赖注入来进行工作的工件: PageContext - 自定义请求上下文 Settings - 全局应用程序设置 这两个都是非常

  • Asp.net core程序中使用微软的依赖注入框架

    我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core的一部分(是asp.net core的一部分),本文这里就简单的介绍下载.net core控制台程序中使用这个框架,顺便也了解下这个框架的全貌. 首先我们需要安装Microsoft.Extensions.DependencyInjection这个Nuget包,也可以直接使用Microsoft.Asp

随机推荐