java專業術語 ioc_什么叫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 = BoyFactory.createBoy();

}

}

親友介紹,固然是好。如果不滿意,盡管另外換一個好了。但是,親友BoyFactory經常是以Singleton的形式出現,不然就是,存在于Globals,無處不在,無處不能。實在是太繁瑣了一點,不夠靈活。我為什么一定要這個親友摻和進來呢?為什么一定要付給她介紹費呢?萬一最好的朋友愛上了我的男朋友呢?

父母包辦:一切交給父母,自己不用費吹灰之力,只需要等著Kiss就好了。

public class Girl {

void kiss(Boy boy){

// kiss boy

boy.kiss();

}

}

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 Princinple,DIP

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 0:不用IOC

public class Girl implements Servicable {

private Kissable kissable;

public Girl() {

kissable = new Boy();

}

public void kissYourKissable() {

kissable.kiss();

}

}

Girl自己建立自己的Boy,很難更換,很難共享給別人,只能單獨使用,并負責完全的生命周期。

IOC type 1,先看代碼:代碼

public class Girl implements Servicable {

Kissable kissable;

public void service(ServiceManager mgr) {

kissable = (Kissable) mgr.lookup(“kissable”);

}

public void kissYourKissable() {

kissable.kiss();

}

}

這種情況出現于Avalon Framework。一個組件實現了Servicable接口,就必須實現service方法,并傳入一個ServiceManager。其中會含有需要的其它組件。只需要在service方法中初始化需要的Boy。

另外,J2EE中從Context取得對象也屬于type 1。它依賴于配置文件。

IOC type 2:

public class Girl {

private Kissable kissable;

public void setKissable(Kissable kissable) {

this.kissable = kissable;

}

public void kissYourKissable() {

kissable.kiss();

}

}

Type 2出現于Spring Framework,是通過JavaBean的set方法來將需要的Boy傳遞給Girl。它必須依賴于配置文件。

IOC type 3:

public class Girl {

private Kissable kissable;

public Girl(Kissable kissable) {

this.kissable = kissable;

}

public void kissYourKissable() {

kissable.kiss();

}

}

這就是PicoContainer的組件 。通過構造函數傳遞Boy給Girl

PicoContainer container = new DefaultPicoContainer();

container.registerComponentImplementation(Boy.class);

container.registerComponentImplementation(Girl.class);

Girl girl = (Girl) container.getComponentInstance(Girl.class);

girl.kissYourKissable();

參考資料

1 http://www.picocontainer.org/presentations/JavaPolis2003.ppt

http://www.picocontainer.org/presentations/JavaPolis2003.pdf

2 DIP, Robert C Martin, Bob大叔的優秀論文

http://www.objectmentor.com/resources/articles/dip.pdf

3 Dependency Injection 依賴注射,Matrin Fowler對DIP的擴展

http://www.martinfowler.com/articles/injection.html

4 IOC框架

PicoContainer 優秀的IOC框架

http://picocontainer.org/

Avalon

http://avalon.apache.org/

Spring Framework

http://www.springframework.org/

HiveMind

http://jakarta.apache.org/commons/hivemind

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python群控模擬安卓系統_手機群控腳本通用版安裝包下載-手機群控腳本通用版apk(云控平板)v1.0.01真機模擬版_新綠資源網...

手機群控腳本通用版apk是一款真機模擬云控平板應用,支持工作室批量掛機搬磚、直播刷人氣點贊、云手機試玩項目、吸粉營銷、智能引流賺錢等功能,無需多部手機,一個APP控制上萬部手機,下載安裝吧!應用介紹:云…

java jsonobject.parse_JSON.parseObject的幾種用法

import com.alibaba.fastjson.JSONObject;一.result格式:{"success":"true";"returnAddress":"123"}JSONObject jsonObjectJSON.parseObject(result); //轉換成objectjsonObject.getString("returnAddress") //獲取object中…

信息系統項目管理師_信息系統項目管理師通過率是多少?

答:信息系統項目管理師考試每個地區的通過率都是不一樣的,一般全國在10%-20%左右,這個20%的通過率是按參考人數作為統計,就是除去了那些報名了但是沒去參加考試的考生,如果算上所有報名考生的通過率數據,那…

類型“unknown”上不存在屬性“foreach”_JavaScript紅寶書第四版精簡解析系列--映射Map數據類型...

Map數據類型顧名思義也就是映射類型,包含一個[[Entries]]私有特性我們可以使用一個二維數組作為初始值const map1 new Map([[1, 1],[2, 2],[3, 3],]); console.log("Map數據類型>", map1);當然也可以使用迭代器進行初始化const map2 new Map({[Symbol.iterator]…

java面試筆試題整理(學習java基礎理論最好的資料)_2020Java筆試/面試題(持續收集整理更新)...

說明:java本篇用于收集知識點方便隨時鞏固,持續更新與糾錯。數組關于JDK版本,若無特殊說明,默認為JDK 1.8,。緩存關于JVM版本,若無特殊說明,默認為 HotSpot。安全目錄數據結構1、Java 基礎1.1 Java中的基本…

JAVA服務器沒回應_Java如何面對無服務器的挑戰?

這是來自jaxcenter組織的一個討論,談論了Java在無服務器浪潮沖擊下面臨的機會和挑戰。下面摘錄主要部分:Spring推動者Pivotal有一個名為 Riff的函數即服務平臺,它是一個開源的、Apache 2許可的、函數即服務平臺,基于Kubernetes和剛…

使用系統調用pipe建立一條管道線_使用Unixbench對服務器綜合性能打分及測試結果...

Unixbench是一個類unix系統(Unix,BSD,Linux)下的性能測試工具,一個開源工具,被廣泛用與測試linux系統主機的性能,簡稱UB。Unixbench的主要測試項目有:系統調用、讀寫、進程、圖形化測試、2D、3D、管道、運算…

java.io.file.sync_Java(25)IO流和File類

IO流File類File類講IO流之前先來講以下File類。Java的標準庫Java.io提供了File類來操作文件和目錄。操作可以有:新建、刪除、重命名等,但是不能訪問文件本身的內容,如果想要訪問,需要使用IO流。新建File對象:package day01;import…

val_loss突然變很大_女朋友突然變得很冷淡是怎么回事?該怎么辦

原本和女朋友戀愛之后她一直都表現得比較比較熱情,但是最近這段時間她突然對自己冷淡起來,很多男生可能就會很疑惑:女朋友突然變得很冷淡是怎么回事?該怎么辦呢?一、女朋友突然變得很冷淡原因不管怎么說,女…

進程調度rr算法java實現_Java實現進程調度算法(二) RR(時間片輪轉)

一、概述因為這次os作業對用戶在控制臺的輸入輸出有要求,所以我花了挺多的代碼來完善控制臺的顯示。也因為我這次要實現多個類似算法,所以將一些共性單獨提取出來作為一個類。如果只想要和算法有關的核心代碼,看RR類的calc()即可。實現思路&a…

python全局變量global線程安全_對python多線程與global變量詳解

今天早上起來寫爬蟲,基本框架已經搭好,添加多線程爬取功能時,發現出錯:比如在下載文件的url列表中加入200個url,開啟50個線程。我的爬蟲…竟然將50個url爬取并全部命名為0.html,也就是說,最后的…

python123第五章_python 3.5學習筆記(第五章)

本章內容1、什么是模塊2、模塊的導入方法3、搜索路徑4、重要標準庫一、什么是模塊1、模塊本質上是一個以.py 結尾的python文件,包含了python對象定義和python語句。2、模塊是用來從邏輯上組織python代碼(定義變量、函數、類、邏輯等)以實現某種功能3、包&#xff1a…

string 長度_String源碼解析

本章源碼分析基于JDK1.7實現的接口String類被final修飾詞修飾,代表不可修改的特性,它實現了三個接口,Serializable是序列化接口,Compareble是排序接口,Char是字符序列接口。主要成員變量char[]:String通過c…

將你一張表的值覆蓋_山西聯通攜手華為完成長風商務區宏微協同,立體覆蓋,打造5G精品網絡...

近日,中國聯通山西分公司(以下簡稱“山西聯通”)在太原長風商務區繼5G CA超高速率升級之后,又針對長風商務區兩層活動區域進行了5G宏微協同的立體覆蓋,實現了該區域5G網絡的連續部署。長風商務區建筑結構設計新穎,占地面積3.06平方…

16速 java_不停歇的 Java 即將發布 JDK 16,新特性速覽!

之前在 JDK 15 中預覽的密封類和接口限制其余類和接口能夠擴展或實現它們。該計劃的目標包括,容許類或接口的做者控制負責實現它的代碼,提供比訪問修飾符更聲明性的方式來限制超類的使用,以及經過提供模式分析的基礎來支持模式匹配的將來方向…

局域網內文件傳輸速度_詳解蒲公英路由器組網 實現文件共享

蒲公英路由器,除了具備普通路由器的功能之外,如圖:最大的特色是可以實現智能組網:最大的特色是可以實現智能組網:采用全新自主研發的Cloud VPN技術替代傳統VPN,基于SD-WAN智能組網方案,快速組建…

java emoji顯示亂碼_Java 解決Emoji表情過濾問題

Emoji表情從三方數據中獲取沒有過濾,導致存入DB的時候報錯。原因:UTF-8編碼有可能是兩個、三個、四個字節。Emoji表情是4個字節,而Mysql的utf8編碼最多3個字節,所以數據插不進去。方法1.將已經建好的表也轉換成utf8mb42&#xff0…

mongotemplate中save拋出異常_異常處理的三個好習慣 | Python 工匠

文 | piglei 編輯 | EarlGrey推薦 | 編程派(微信ID:codingpy)前言如果你用 Python 編程,那么你就無法避開異常,因為異常在這門語言里無處不在。打個比方,當你在腳本執行時按 ctrlc 退出,解釋器就會產生一個 KeyboardI…

java 百度網盤上傳_使用pcs api往免費的百度網盤上傳下載文件的方法

百度個人云盤空間大,完全免費,而且提供了pcs api供調用操作文件,在平時的項目里往里面保存一些文件是很實用的。環境準備:開通讀寫網盤的權限及獲取access_token:http://blog.csdn.net/langyuezhang/article/details/47206621百度…

python縮進教學_Python縮進和選擇學習

縮進Python最具特色的是用縮進來標明成塊的代碼。我下面以if選擇結構來舉例。if后面跟隨條件,如果條件成立,則執行歸屬于if的一個代碼塊。先看C語言的表達方式(注意,這是C,不是Python!)if ( i > 0 ){ x 1; y 2;}如果i …