依賴注入(DI) 控制反轉(zhuǎn)(IOC) 反射(Reflection) 面向切面編程AOP

一袖牙、依賴注入(DI) 控制反轉(zhuǎn)(IOC)
QQ截圖20160810142759.png
QQ截圖20160810143011.png
QQ截圖20160810143033.png

先看上面三張圖使用的公共組件ToggleBar酒觅,這個(gè)組件要求左按鈕和右按鈕點(diǎn)擊的時(shí)候悯恍,顯示的內(nèi)容會(huì)向左或向右緩動(dòng)奶段,隱藏掉一部分饥瓷,并顯示之前遮住的一部分。如圖所示痹籍,不同的應(yīng)用場(chǎng)景呢铆,每一個(gè)小格子內(nèi)容是不同的,有的是一個(gè)按鈕蹲缠,有的是一個(gè)物品圖標(biāo)棺克,有的復(fù)雜些悠垛,還有文本,我們簡(jiǎn)稱為renderA,renderB,renderC娜谊。這些變化的部分确买,作為ToggleBar的設(shè)計(jì)者,是不可預(yù)知的纱皆,可知的只有點(diǎn)擊左右按鈕拇惋,它們會(huì)排成一行做緩動(dòng)。那么抹剩,我們應(yīng)該怎么設(shè)計(jì)才能方便使用者呢撑帖?
毫無(wú)疑問(wèn),ToggleBar中必須有一個(gè)對(duì)象保存著這些變化的內(nèi)容用來(lái)展示澳眷,就叫render吧胡嘿。它的類型可以是renderA,renderB,renderC的基類,當(dāng)然是一個(gè)接口更方便钳踊,把它們共有的邏輯再抽象到基類里衷敌。這樣ToggleBar就要求使用它的時(shí)候,必須指明一個(gè)render接口的對(duì)象拓瞪,否則它不知道怎么去顯示缴罗。
第二個(gè)問(wèn)題就是怎么把這個(gè)Render傳進(jìn)去,最好是在構(gòu)造方法里要求傳入祭埂,因?yàn)闃?gòu)造方法里需要執(zhí)行UI初始化面氓。也可以使用setRender方法重置。
總結(jié):ToggleBar依賴render才能正常工作蛆橡,但render的構(gòu)造卻不受它控制舌界,它把控制權(quán)交給了具體的使用者,這就是控制反轉(zhuǎn)泰演。render通過(guò)構(gòu)造方法傳入呻拌,這個(gè)就叫依賴注入。

以下參考輕松理解 Java開(kāi)發(fā)中的依賴注入(DI)和控制反轉(zhuǎn)(IOC)

對(duì)比以下的兩個(gè)簡(jiǎn)單程序:
簡(jiǎn)單java程序
<pre>
package demo;
public class Activity {
public Activity(){
this.onCreate();
}
public void onCreate(){
System.out.println("onCreate called");
}
public void sayHi(){
System.out.println("Hello world!");
}
public static void main(String[] args) {
Activity a = new Activity();
a.sayHi();
}
}
</pre>

簡(jiǎn)單Android程序
<pre>
package demo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.append("Hello ");
tv.append("world!");
setContentView(tv);
}
}
</pre>

這兩個(gè)程序最大的區(qū)別就是,前者程序的運(yùn)行完全由開(kāi)發(fā)控制,后者程序的運(yùn)行由Android框架控制.兩個(gè)程序都有個(gè)onCreate方法.前者程序中,如果開(kāi)發(fā)者覺(jué)得onCreate 名稱不合適,想改為Init,沒(méi)問(wèn)題,直接就可以改, 相比下,后者的onCreate 名稱就不能修改.因?yàn)?后者使用了框架,享受框架帶來(lái)福利的同時(shí),就要遵循框架的規(guī)則.
這就是控制反轉(zhuǎn).可以說(shuō), 控制反轉(zhuǎn)是所有框架最基本的特征.也是框架和普通類庫(kù)最大的不同點(diǎn).
很多Android開(kāi)發(fā)工程師在享用控制反轉(zhuǎn)帶來(lái)的便利,去不知什么是控制反轉(zhuǎn).就有點(diǎn)像深海里的魚不知到什么是海水一樣.
通過(guò)框架可以把許多共用的邏輯放到框架里,讓用戶專注自己程序的邏輯.這也是為什么現(xiàn)在,無(wú)論手機(jī)開(kāi)發(fā),網(wǎng)頁(yè)開(kāi)發(fā),還是桌面程序, 也不管是Java,PHP,還是Python框架無(wú)處不在.

二睦焕、反射

通過(guò)字符串獲取類藐握,動(dòng)態(tài)生成對(duì)象±埃可以使用XML文件來(lái)組織這些字符串猾普。反射主要是升級(jí)了工廠模式。
參考
Java反射入門
Java基礎(chǔ)與提高干貨系列——Java反射機(jī)制

以下參考Java反射機(jī)制的適用場(chǎng)景及其利與弊

  • Java的反射機(jī)制在做基礎(chǔ)框架的時(shí)候非常有用缔御,有一句話這么說(shuō)來(lái)著:反射機(jī)制是很多Java框架的基石抬闷。而一般應(yīng)用層面很少用,不過(guò)這種東西,現(xiàn)在很多開(kāi)源框架基本都已經(jīng)給你封裝好了笤成,自己基本用不著寫评架。典型的除了hibernate之外,還有spring也用到很多反射機(jī)制炕泳。經(jīng)典的就是在xml文件或者properties里面寫好了配置纵诞,然后在Java類里面解析xml或properties里面的內(nèi)容,得到一個(gè)字符串培遵,然后用反射機(jī)制浙芙,根據(jù)這個(gè)字符串獲得某個(gè)類的Class實(shí)例,這樣就可以動(dòng)態(tài)配置一些東西籽腕,不用每一次都要在代碼里面去new或者做其他的事情嗡呼,以后要改的話直接改配置文件,代碼維護(hù)起來(lái)就很方便了皇耗,同時(shí)有時(shí)候要適應(yīng)某些需求南窗,Java類里面不一定能直接調(diào)用另外的方法,這時(shí)候也可以通過(guò)反射機(jī)制來(lái)實(shí)現(xiàn)郎楼。
    總的來(lái)說(shuō)万伤,自己寫的很少,具體什么時(shí)候要用那要看需求呜袁,反射機(jī)制無(wú)非就是根據(jù)一個(gè)String來(lái)得到你要的實(shí)體對(duì)象敌买,然后調(diào)用它原來(lái)的東西。但是如果是要自己寫框架的話阶界,那就會(huì)用得比較多了虹钮。
  • 當(dāng)你做一個(gè)軟件可以安裝插件的功能,你連插件的類型名稱都不知道荐操,你怎么實(shí)例化這個(gè)對(duì)象呢芜抒?因?yàn)槌绦蚴侵С植寮模ǖ谌降模┱洳撸陂_(kāi)發(fā)的時(shí)候并不知道 托启。所以無(wú)法在代碼中 New出來(lái) ,但反射可以攘宙,通過(guò)反射屯耸,動(dòng)態(tài)加載程序集,然后讀出類蹭劈,檢查標(biāo)記之后再實(shí)例化對(duì)象疗绣,就可以獲得正確的類實(shí)例。
  • 在編碼階段不知道那個(gè)類名,要在運(yùn)行期從配置文件讀取類名, 這時(shí)候就沒(méi)有辦法硬編碼new ClassName(),而必須用到反射才能創(chuàng)建這個(gè)對(duì)象.反射的目的就是為了擴(kuò)展未知的應(yīng)用铺韧。比如你寫了一個(gè)程序多矮,這個(gè)程序定義了一些接口,只要實(shí)現(xiàn)了這些接口的dll都可以作為插件來(lái)插入到這個(gè)程序中。那么怎么實(shí)現(xiàn)呢塔逃?就可以通過(guò)反射來(lái)實(shí)現(xiàn)讯壶。就是把dll加載進(jìn)內(nèi)存,然后通過(guò)反射的方式來(lái)調(diào)用dll中的方法湾盗。很多工廠模式就是使用的反射伏蚊。
三、AOP

參考JavaWeb過(guò)濾器.監(jiān)聽(tīng)器.攔截器-原理&區(qū)別-個(gè)人總結(jié)
面向切面編程(AOP是Aspect Oriented Program的首字母縮寫) 格粪,我們知道躏吊,面向?qū)ο蟮奶攸c(diǎn)是繼承、多態(tài)和封裝帐萎。而封裝就要求將功能分散到不同的對(duì)象中去比伏,這在軟件設(shè)計(jì)中往往稱為職責(zé)分配。實(shí)際上也就是說(shuō)疆导,讓不同的類設(shè)計(jì)不同的方法凳怨。這樣代碼就分散到一個(gè)個(gè)的類中去了。這樣做的好處是降低了代碼的復(fù)雜程度是鬼,使類可重用肤舞。但是人們也發(fā)現(xiàn),在分散代碼的同時(shí)均蜜,也增加了代碼的重復(fù)性李剖。什么意思呢?比如說(shuō)囤耳,我們?cè)趦蓚€(gè)類中篙顺,可能都需要在每個(gè)方法中做日志。按面向?qū)ο蟮脑O(shè)計(jì)方法充择,我們就必須在兩個(gè)類的方法中都加入日志的內(nèi)容德玫。也許他們是完全相同的,但就是因?yàn)槊嫦驅(qū)ο蟮脑O(shè)計(jì)讓類與類之間無(wú)法聯(lián)系椎麦,而不能將這些重復(fù)的代碼統(tǒng)一起來(lái)宰僧。也許有人會(huì)說(shuō),那好辦啊观挎,我們可以將這段代碼寫在一個(gè)獨(dú)立的類獨(dú)立的方法里琴儿,然后再在這兩個(gè)類中調(diào)用。但是嘁捷,這樣一來(lái)造成,這兩個(gè)類跟我們上面提到的獨(dú)立的類就有耦合了,它的改變會(huì)影響這兩個(gè)類雄嚣。那么晒屎,有沒(méi)有什么辦法,能讓我們?cè)谛枰臅r(shí)候,隨意地加入代碼呢鼓鲁?**這種在運(yùn)行時(shí)履肃,動(dòng)態(tài)地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程坐桩。 **一般而言尺棋,我們管切入到指定類指定方法的代碼片段稱為切面,而切入到哪些類绵跷、哪些方法則叫切入點(diǎn)膘螟。有了AOP,我們就可以把幾個(gè)類共有的代碼碾局,抽取到一個(gè)切片中荆残,等到需要時(shí)再切入對(duì)象中去,從而改變其原有的行為净当。這樣看來(lái)内斯,AOP其實(shí)只是OOP的補(bǔ)充而已。OOP從橫向上區(qū)分出一個(gè)個(gè)的類來(lái)像啼,而AOP則從縱向上向?qū)ο笾屑尤胩囟ǖ拇a俘闯。有了AOP,OOP變得立體了忽冻。如果加上時(shí)間維度真朗,AOP使OOP由原來(lái)的二維變?yōu)槿S了,由平面變成立體了僧诚。從技術(shù)上來(lái)說(shuō)遮婶,AOP基本上是通過(guò)代理機(jī)制實(shí)現(xiàn)的。AOP在編程歷史上可以說(shuō)是里程碑式的湖笨,對(duì)OOP編程是一種十分有益的補(bǔ)充旗扑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市慈省,隨后出現(xiàn)的幾起案子臀防,更是在濱河造成了極大的恐慌,老刑警劉巖辫呻,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件清钥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡放闺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門缕坎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怖侦,“玉大人,你說(shuō)我怎么就攤上這事∝仪蓿” “怎么了搬葬?”我有些...
    開(kāi)封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)艳悔。 經(jīng)常有香客問(wèn)我急凰,道長(zhǎng),這世上最難降的妖魔是什么猜年? 我笑而不...
    開(kāi)封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任抡锈,我火速辦了婚禮,結(jié)果婚禮上乔外,老公的妹妹穿的比我還像新娘床三。我一直安慰自己,他們只是感情好杨幼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布撇簿。 她就那樣靜靜地躺著,像睡著了一般差购。 火紅的嫁衣襯著肌膚如雪四瘫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天欲逃,我揣著相機(jī)與錄音莲组,去河邊找鬼。 笑死暖夭,一個(gè)胖子當(dāng)著我的面吹牛锹杈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迈着,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼竭望,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了裕菠?” 一聲冷哼從身側(cè)響起咬清,我...
    開(kāi)封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奴潘,沒(méi)想到半個(gè)月后旧烧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡画髓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年掘剪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奈虾。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夺谁,死狀恐怖廉赔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匾鸥,我是刑警寧澤蜡塌,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站勿负,受9級(jí)特大地震影響馏艾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜奴愉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一琅摩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躁劣,春花似錦迫吐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鳖擒,卻和暖如春溉浙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒋荚。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工戳稽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人期升。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓惊奇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親播赁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颂郎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,789評(píng)論 25 707
  • 團(tuán)隊(duì)開(kāi)發(fā)框架實(shí)戰(zhàn)—面向切面的編程 AOP 引言 軟件開(kāi)發(fā)的目標(biāo)是要對(duì)世界的部分元素或者信息流建立模型,實(shí)現(xiàn)軟件系統(tǒng)...
    Bobby0322閱讀 4,143評(píng)論 4 49
  • 蟋蟀聒噪著 天漸漸黑的早了 夏日的余溫 被秋風(fēng)吹散 換來(lái)梧桐樹(shù)葉 散落滿地 針織衫和碎花裙 遠(yuǎn)處傳來(lái)的狗吠 雨滴淅...
    Sarah_Genia閱讀 105評(píng)論 0 0
  • 01 今天早上醒來(lái)的時(shí)候在公眾號(hào)的后臺(tái)收到了一個(gè)土豆發(fā)來(lái)的消息:每天到十點(diǎn)就一直會(huì)點(diǎn)開(kāi)看看,等待你的推文或圖片坎背,今...
    potatohorse閱讀 506評(píng)論 6 1