zoukankan      html  css  js  c++  java
  • 一个关于依赖注入的故事

    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 }
  • 相关阅读:
    VMWare 桥接模式
    什么是交叉编译,为什么要使用交叉编译
    最常用的四种大数据分析方法
    C#的Dispose模式复习
    Oracle Data Provider for .NET Support for Microsoft .NET Core
    微软发布了量子计算开发包
    关于Oracle分区表的理解
    html 中video标签视频不自动播放的问题
    input 修改placeholder颜色
    正则表达式 手机号验证、邮箱验证、6~16位数字加字母组合、身份证号码验证
  • 原文地址:https://www.cnblogs.com/TimeStory/p/3871024.html
Copyright © 2011-2022 走看看