首页 > Java开发 > 依赖注入与控制反转

依赖注入与控制反转

文艺:

赤土神州浩瀚无边,其中的南胜州,永夜森林中有一个原始部落,他们每次打猎都会带回很多鸟蛋,蛋的大小被划分成大中小三种,每次他们只会采集一个型号的蛋。在回去部落前,他们会派出斥候,通知部落中管理器械的大司猎带回的是哪一种型号的蛋,大司猎会准备相应的放蛋的镂空木板,分大中小三种,对应每种木板会有相应的取蛋器。他会派人将这些木板和取蛋器集装在一个黑盒子中,运到部落门口,在那里早有部落中的少女们等着。

当勇士们(在这里我们不讨论掏鸟窝算不算勇士)回来之后,少女们就会打开黑盒子,将勇士们的蛋装进木板中。

 

文艺解析:

1.少女们不关心拿来的是什么型号的木板,也不关心勇士们蛋的大小。事实上,她们要做的只是用取蛋器将蛋嵌在木板的孔洞上。

2.大司猎根据斥候的报告装箱相应的木板和取蛋器。

3.这些木板和取蛋器大同小异,都是工匠根据同一个 原始抽象构想 针对 实际情况实现。

 

 

程序员眼中的文艺:

接口:为了解决每次装蛋的繁琐过程,部落中的人想到一种流程,将蛋放在一种带洞的板上卡住,他们创建了一个木板工具套的接口,命名为取蛋套装。

实现接口的类:大中小取蛋套装实际了取蛋套装这个接口,并且定义了工具使用的方法。

容器:容器(大司猎)决定注入哪种取蛋套装。

  取蛋操作流:少女作为泛型类,她们事先并不知道会使用哪种取蛋器,只有到了现场她们才会自动使用容器中的方法和属性。

实际应用:勇士组织是整个流程的实际使用者,他们通知大司猎装箱,调用少女为他们装蛋……

 

伪代码表示:

接口:

 

[csharp][/csharp] view plaincopy

  1. //取蛋接口
  2.    public interface IEggManager
  3.    {
  4.        //设置取蛋器
  5.        void setEggTool(EggTool eggTool);
  6.        //设置蛋板
  7.        void setEggBoard(EggBoard eggBoard);
  8.        //取蛋操作
  9.        bool getEgg(Egg egg);
  10.        //放置蛋的操作
  11.        bool placeEgg(Egg egg);
  12.        string sayYouself();
  13.    }

实现类:

 

 

[csharp][/csharp] view plaincopy

  1. //大蛋实现类
  2. public class EggManagerImp_BigEgg:IEggManager
  3. {
  4.     EggTool eggTool;
  5.     EggBoard eggBoard;
  6.     public void IEggManager.setEggTool(EggTool eggTool)
  7.     {
  8.         this.eggTool = eggTool;
  9.     }
  10.     public void IEggManager.setEggBoard(EggBoard eggBoard)
  11.     {
  12.         this.eggBoard = eggBoard;
  13.     }
  14.     bool IEggManager.getEgg(Egg egg)
  15.     {
  16.         //取大蛋需要的最小力与最大力,移动速度,等等
  17.     }
  18.     bool IEggManager.placeEgg(Egg egg)
  19.     {
  20.         //放置大蛋的需要的最小力与最大力,移动速度,等等
  21.     }
  22.     public string sayYouself()
  23.     {
  24.         return "I am for BigEgg!";
  25.     }
  26. }
  27. //中蛋实现类
  28. public class EggManagerImp_MiddleEgg : IEggManager
  29. {
  30.     //……其他接口方法实现
  31.     public string sayYouself()
  32.     {
  33.         return "I am for MiddleEgg!";
  34.     }
  35. }
  36. //小蛋实现类
  37. public class EggManagerImp_SmallEgg : IEggManager
  38. {
  39.     //……其他接口方法实现
  40.     public string sayYouself()
  41.     {
  42.         return "I am for SmallEgg!";
  43.     }
  44. }

少女装蛋的事务:

 

 

[csharp][/csharp] view plaincopy

  1. //少女装蛋流程
  2.    public class Virginity
  3.    {
  4.        IEggManager iegg;
  5.        public IEggManager getEgg()
  6.        {
  7.            return iegg;
  8.        }
  9.        public void setEgg(IEggManager iegg)
  10.        {
  11.            this.iegg = iegg;
  12.        }
  13.        //……其他接口方法实现
  14.        public string sayYou()
  15.        {
  16.            return iegg.sayYouself();
  17.        }
  18.    }

 

 

大司猎容器,假设此次是大型蛋:

 

[csharp][/csharp] view plaincopy

  1. //大司猎容器,假设此次装的蛋是大型的
  2.   public class Container
  3.   {
  4.       public Virginity setBean()
  5.       {
  6.           IEggManager iegg = new EggManagerImp_BigEgg ();
  7.           Virginity vir = new Virginity();
  8.           //大司猎注入大蛋操作到少女中,使少女的操作有了实际执行力
  9.           vir.setEgg(iegg);
  10.           //返回完整的可以操作此次蛋的流程
  11.           return vir;
  12.       }
  13.   }

勇士使用整个业务流:

 

 

[csharp][/csharp] view plaincopy

  1. public class Hero
  2.    {
  3.        Containerx con =new Containerx();
  4.        Virginity virg = con.setBean();
  5.        //输出"I am for BigEgg!"
  6.        virg.sayYou();
  7.    }

本文固定链接: http://www.devba.com/index.php/archives/2871.html | 开发吧

报歉!评论已关闭.