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 }