熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

控制反轉(Inversion of Control)介紹

2013-11-23 17:57:36  來源: Javascript 

  什麼是IOC
  IoC就是Inversion of Control控制反轉在Java開發中IoC意味著將你設計好的類交給系統去控制而不是在你的類內部控制這稱為控制反轉
  
  下面我們以幾個例子來說明什麼是IoC
  
  假設我們要設計一個Girl和一個Boy類其中Girl有kiss方法即Girl想要Kiss一個Boy那麼我們的問題是Girl如何能夠認識這個Boy?
  
 

  在我們中國常見的MM與GG的認識方式有以下幾種
  
  1 青梅竹馬 2 親友介紹 3 父母包辦
  
  那麼哪一種才是最好呢?
  
  青梅竹馬Girl從小就知道自己的Boy
  
 

  代碼:
  public class Girl { 
  void kiss(){
    Boy boy = new Boy();
  }
  }
  
  然而從開始就創建的Boy缺點就是無法在更換並且要負責Boy的整個生命周期如果我們的Girl想要換一個怎麼辦?(筆者嚴重不支持Girl經常更換Boy)
  
  親友介紹由中間人負責提供Boy來見面
  
 

  代碼:
  public class Girl {
  void kiss(){
    Boy boy = BoyFactorycreateBoy();   
  }
  }
  
  親友介紹固然是好如果不滿意盡管另外換一個好了但是親友BoyFactory經常是以Singleton的形式出現不然就是存在於Globals無處不在無處不能實在是太繁瑣了一點不夠靈活我為什麼一定要這個親友摻和進來呢?為什麼一定要付給她介紹費呢?萬一最好的朋友愛上了我的男朋友呢?
  
  父母包辦一切交給父母自己不用費吹灰之力只需要等著Kiss就好了
  
 

  代碼:
  public class Girl {
  void kiss(Boy boy){
    // kiss boy 
   boykiss();
  }
  }
  
  Well這是對Girl最好的方法只要想辦法賄賂了Girl的父母並把Boy交給他那麼我們就可以輕松的和Girl來Kiss了看來幾千年傳統的父母之命還真是有用哦至少Boy和Girl不用自己瞎忙乎了
  
  這就是IOC將對象的創建和獲取提取到外部由外部容器提供需要的組件
  
  我們知道好萊塢原則Do not call us we will call you 意思就是You girlie do not call the boy We will feed you a boy
  
  我們還應該知道依賴倒轉原則即 Dependence Inversion PrincinpleDIP
  
 

  Eric Gamma說要面向抽象編程面向接口編程是面向對象的核心
  
  組件應該分為兩部分
  
  Service 所提供功能的聲明
  
  Implementation Service的實現
  
  好處是多實現可以任意切換防止 everything depends on everything 問題.即具體依賴於具體
  
  所以我們的Boy應該是實現Kissable接口這樣一旦Girl不想kiss可惡的Boy的話還可以kiss可愛的kitten和慈祥的grandmother
  

  IOC的type
  IoC的Type指的是Girl得到Boy的幾種不同方式我們逐一來說明
  
  IOC type 不用IOC
  
  代碼:
  public class Girl implements Servicable {
  
  private Kissable kissable;
  
  public Girl() {
    kissable = new Boy();
  }
  
  public void kissYourKissable() {
    kissablekiss();
  }
  
  }
  
  Girl自己建立自己的Boy很難更換很難共享給別人只能單獨使用並負責完全的生命周期
  
  IOC type 先看代碼
  
  代碼:
  public class Girl implements Servicable {
  
  Kissable kissable;
  
  public void service(ServiceManager mgr) {
    kissable = (Kissable) mgrlookup(kissable);
  }
  
  public void kissYourKissable() {
    kissablekiss();
  }
  
  }
  
  這種情況出現於Avalon Framework一個組件實現了Servicable接口就必須實現service方法並傳入一個ServiceManager其中會含有需要的其它組件只需要在service方法中初始化需要的Boy
  
  另外JEE中從Context取得對象也屬於type
  
  它依賴於配置文件
  
  代碼:
  
    …
  
  IOC type
  
  代碼:
  public class Girl {
  
  private Kissable kissable;
  
  public void setKissable(Kissable kissable) {
    thiskissable = kissable;
  }
  
  public void kissYourKissable() {
    kissablekiss();
  }
  
  }
  
  Type 出現於Spring Framework是通過JavaBean的set方法來將需要的Boy傳遞給Girl它必須依賴於配置文件
  
  代碼:
  
  IOC type :
  
  代碼:
  public class Girl {
  
  private Kissable kissable;
  
  public Girl(Kissable kissable) {
    thiskissable = kissable;
  }
  
  public void kissYourKissable() {
    kissablekiss();
  }
  
  }
  
  這就是PicoContainer的組件 通過構造函數傳遞Boy給Girl
  代碼:
  
  PicoContainer container = new DefaultPicoContainer();
  containerregisterComponentImplementation(Boyclass);
  containerregisterComponentImplementation(Girlclass);
  Girl girl = (Girl) containergetComponentInstance(Girlclass);
  girlkissYourKissable();
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25429.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.