一个关于依赖注入的故事

1、关于控制反转和依赖注入的理解:

控制反转:一般的,当实体类被使用时,调用者需要创建实体类的实例。控制反转的意思即是调用者不再实例化实体类了,而只是声明类对象和封装对象的使用。具体的实例化由容器来实现。
依赖注入:依赖注入是控制反转这种设计模式的一个关键步骤。把对象的实例化交给容器时,容器负责生成具体的实体类对象,并把对象注入到调用者类中,那么此时,调用者就实现了实体类的声明、定义、和使用了。

作用:达到削减计算机程序的耦合度的作用。

2、故事角色以及职责

类名 备注(职责)
seed、Pine 、Bombax 种子接口、松树类、木棉树类
Forest 森林类、调用者、控制器
Scientist 科学家类、注入器
Person 人类、客户端

3、故事背景

实体类为种子,松树,木棉树等树类,一开始种子不知道会长成什么树,但这是一颗树的种子没有错,长大后会拥有树的功能。

森林是一个控制器,被控制者为种子和树。在森林里,森林类声明了种子的身份,并封装了种子的功能,但由于还不知道是什么树的种子,所以还处于种子分类阶段。

科学家是一个可以改变种子命名的类,科学家掌控着森林里种子的命运,可以决定种子长成何种树。科学家决定种植何种树后,就到森林里往种子里面注入液体,并告知森林。

人类是种子的使用者,是执行者和种子功能的受用者。

4、一个关于依赖注入的故事

从前有一颗种子,是一棵树的种子,但它不知道是一棵什么树,但至少还有遮荫的功能。

种子接口:

 1 package story;
 2
 3 /**
 4  * 种子接口,只知道是一颗树的种子,而树是有遮荫功能的。
 5  *
 6  * @author Qiaofengbo
 7  *
 8  */
 9 public interface Seed {
10
11     static final String name = "树";
12
13     void function();
14 }

它在想,它有可能是一棵松树,将来长成一棵参天大树;也可能是一棵木棉树,即可遮荫,花还能入药……
松树类:

 1 package story;
 2
 3 public class Pine implements Seed {
 4     /**
 5      * 松树类,有遮荫功能
 6      */
 7     public void function() {
 8         // TODO Auto-generated method stub
 9         System.out.println("我是松树");
10     }
11
12 }

木棉树类:

 1 package story;
 2
 3 public class Bombax implements Seed {
 4     /**
 5      * 木棉树类,有遮荫功能
 6      */
 7     public void function() {
 8         // TODO Auto-generated method stub
 9
10         System.out.println("我是木棉树");
11     }
12
13 }

作为一棵树,森林才是它们的主场。就像战场是士兵的归宿一样。所以它来到了森林。森林对所有的种子都有管理的能力,并且分区栽种各种树。

森林类:

 1 package story;
 2
 3 /**
 4  * 森林类,种子重在森林里,是什么树的种子不那么重要,有遮荫功能就行
 5  *
 6  * @author Qiaofengbo
 7  *
 8  */
 9 public class Forest {
10
11     private Seed seed;
12
13     public Seed getSeed() {
14         return seed;
15     }
16
17     public void setSeed(Seed seed) {
18         this.seed = seed;
19     }
20
21     /**
22      * 种植松树种子
23      */
24     public void planting_Pine() {
25         seed.function();
26     }
27
28     /**
29      * 种植木棉树种子
30      */
31     public void planting_Bombax() {
32         seed.function();
33     }
34 }

虽然森林里已经为各种树分好区域种植了,但由于不清楚种子的种类,所以需要分配好种子。
为了在规定的区域栽种树,而不出错,科学家往种子里面注入了一种决定种子种类的液体,从而百分百的决定了种子的种类。再把经过注入的种子交给森林。

科学家类:

 1 package story;
 2
 3 /**
 4  * 科学家类,有决定种子长成什么树的能力,通过向种子注入东西改变种子
 5  *
 6  * @author Qiaofengbo
 7  *
 8  */
 9 public class Scientist {
10
11     public static Forest injection_Pine() {
12         Seed pine = new Pine();
13         Forest forest = new Forest();
14         // 注入
15         forest.setSeed(pine);
16
17         // forest.planting_Pine();
18         return forest;
19     }
20
21     public static Forest injection_Bombax() {
22         Seed bombax = new Bombax();
23         Forest forest = new Forest();
24         forest.setSeed(bombax);
25         // forest.planting_Bombax();
26         return forest;
27     }
28 }

人类从森林的规定区域去种子栽种,种出来的树就是想要得到的树。

人类:

 1 package story;
 2
 3 /**
 4  * 人类,决定科学家注入什么给种子
 5  *
 6  * @author Qiaofengbo
 7  *
 8  */
 9 public class Person {
10
11     public static void main(String args[]) {
12         planting();
13     }
14
15     public static void planting() {
16         Forest forest = Scientist.injection_Bombax();
17         // 开始种植
18         forest.planting_Pine();
19     }
20 }
时间: 2024-11-05 14:40:58

一个关于依赖注入的故事的相关文章

[ASP.NET Core 3框架揭秘] 依赖注入:一个Mini版的依赖注入框架

在前面的章节中,我们从纯理论的角度对依赖注入进行了深入论述,我们接下来会对.NET Core依赖注入框架进行单独介绍.为了让读者朋友能够更好地理解.NET Core依赖注入框架的设计与实现,我们按照类似的原理创建了一个简易版本的依赖注入框架,也就是我们在前面多次提及的Cat. 源代码下载 普通服务的注册与消费泛型服务的注册与消费多服务实例的提供服务实例的生命周期 一.编程体验 虽然我们对这个名为Cat的依赖注入框架进行了最大限度的简化,但是与.NET Core框架内部使用的真实依赖注入框架相比,

Angular2 依赖注入

1. 使用DI 依赖注入是一个很重要的程序设计模式. Angular 有自己的依赖注入框架,离开了它,我们几乎没法构建 Angular 应用.它使用得非常广泛,以至于几乎每个人都会把它简称为 DI. 我们来看一个简单的例子: export class Animal { dogs; constructor() { var dog = new Dog(); } } 我们的Animal在构造函数中手工创建所需的每样东西.问题在于,我们这个 Animal类过于脆弱.缺乏弹性并且难以测试. 当我们的Ani

ninject依赖注入

ninject是一个轻量级的依赖注入在性能上不及spring,castle的依赖注入但在一般的项目中还是能满足需求的,话不所说看看怎么用吧! 首先在nuget上下载安装包: 新建一个mvc项目: 在项目中新建一个NinjectWebComment类,在类中添加下列代码: public static class NinjectWebCommon { private static readonly Bootstrapper bootstrapper = new Bootstrapper(); ///

依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .

3.2.    “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模式则是其反向的,即被动地等待别人做好一个依赖对象提供给我. 在美国好莱坞众多电影工厂在寻找演员的时候通常奉行着这么一个原则:不要找我,需要的时候我去找你(“Don’tcall us; we’ll call you!”),把相同的思路运用到我们的软件工程里通常也被称作“好莱坞原则”(Hollywood

编码最佳实践——依赖注入原则

我们在这个系列的前四篇文章中分别介绍了SOLID原则中的前四个原则,今天来介绍最后一个原则--依赖注入原则.依赖注入(DI)是一个很简单的概念,实现起来也很简单.但是简单却掩盖不了它的重要性,如果没有依赖注入,前面的介绍的SOLID技术原则都不可能实际应用. 控制反转(IoC) 人们在谈论依赖注入的时候,经常也会谈到另一个概念--控制反转(IoC).按照大内老A的解释:"IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架中以实现对流程的复用,并按照"好莱坞法则

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目,选择Web API模版. →在Models文件夹创建一个Book.cs类. namespace MyMvcAndWebApi.Models { public class Book { public int Id { get; set; } public string Name { get; set

一个简单例子带你理解 依赖注入

刚出来工作就遇到了一个棘手的问题:依赖注入 公司的软件需求更新频率较高,所以前辈们为了满足需求,方便更新,就用到了依赖注入这个东西. 在之前都没有听说过那个东西,所以一开始简直是蒙了,然后各种百度,发现依赖注入这个东西还是个热门话题! 可是热门不代表自己能好理解,网上的好文章很多,可是自己慧根不够,看着看着就晕了. 不过文章大豆提到了一个东西  反射  .完了,又是一个没听说过的名字(博主自学开发,可能软件专业的会提到). 于是接着各种百度  反射 ,大概了解了什么叫做 反射.可是这个时候又开始

用工厂模式解决ASP.NET Core中依赖注入的一个烦恼

这是最近在实际开发中遇到的一个问题,用 asp.net core 开发一个后端 web api ,根据指定的 key 清除 2 台 memcached 服务器上的缓存.背景是我们在进行 .net core 迁移工作,asp.net 项目与 asp.net core 项目并存,为了避免两种类型项目的缓存冲突,我们分别用了 2 台不同的 memcached 服务器. 之前使用 1 台 memcached 服务器时,只需要一个客户端,所以只需创建一个 MemcachedClient 单例并注入到 IM