從 “狀態(tài)模式” 解析App登錄功能實(shí)戰(zhàn)技巧

一、緒

上篇博客和大家分享了ffmpeg的編譯流程以及在AndroidStudio中集成缨恒。最近由于對(duì)ffmpeg的涉獵進(jìn)展較慢,但是為了保持持續(xù)的狂暴之心,還是不能停止博客的更新谓晌。所以今天和大家分享一篇關(guān)于設(shè)計(jì)模式的內(nèi)容。想必有些朋友看到設(shè)計(jì)模式幾字就有點(diǎn)精神錯(cuò)亂癞揉,四肢麻木纸肉。哈哈,開(kāi)個(gè)玩笑喊熟。我不會(huì)以單純描述設(shè)計(jì)模式來(lái)表達(dá)柏肪,這樣的博客隨便一搜很多。既然要說(shuō)設(shè)計(jì)模式逊移,畢竟缺少不了實(shí)戰(zhàn)的結(jié)合预吆。

二、介紹

設(shè)計(jì)模式所帶來(lái)的效益是顯而易見(jiàn)的胳泉,23種設(shè)計(jì)模式體現(xiàn)了7種思想原則的守恒拐叉。大家最常用也最常聽(tīng)說(shuō)的 單例模式、原型模式扇商、工廠(chǎng)模式凤瘦、觀(guān)察者模式、建造者模式等等案铺,同樣很多模式在Android源碼或者優(yōu)秀的第三方開(kāi)源庫(kù)中體驗(yàn)的淋漓盡致蔬芥。例如圖片加載庫(kù),Glide控汉,ImageLoader等等都以getInstance的方式使用了單例模式(雙重鎖檢查機(jī)制)笔诵,Android源碼中AlertDialog使用build體現(xiàn)的建造者模式Intent提供的clone原型模式姑子,3.0后的屬性動(dòng)畫(huà)插值器所體現(xiàn)的策略模式等等乎婿。本篇博客和大家分享一下狀態(tài)模式的定義以及實(shí)戰(zhàn)的使用。

三街佑、狀態(tài)模式的定義

狀態(tài)模式包含了三種定義:

(1)控制器

(2)抽象狀態(tài)或狀態(tài)接口

(3)具體狀態(tài)

怎么理解三者之間的關(guān)系呢谢翎?看下面展示圖:

上圖中,Context也就是控制器沐旨,即使用環(huán)境森逮。State即為抽象狀態(tài)或狀態(tài)接口,Concrete

State

A,B即為具體的狀態(tài)實(shí)現(xiàn)磁携,即狀態(tài)的具體行為褒侧。三者的關(guān)系顯而易見(jiàn),在Context中提供setState以注入的方式來(lái)改變不同的狀態(tài)谊迄,體現(xiàn)不同狀態(tài)下的不同行為闷供。

四、簡(jiǎn)例

生活處處有設(shè)計(jì)模式鳞上。拿生活中的電視遙控器例子來(lái)說(shuō)这吻,在電視開(kāi)機(jī)狀態(tài)下,遙控器可以控制音量篙议,頻道切換等等唾糯,關(guān)機(jī)狀態(tài)下,對(duì)于電視的任何操作都不能進(jìn)行鬼贱。

此時(shí)移怯,遙控器就對(duì)應(yīng)于Context,State對(duì)應(yīng)于電視的狀態(tài)这难,具體狀態(tài)對(duì)應(yīng)于電視的開(kāi)機(jī)舟误、關(guān)機(jī):

代碼描述如下:

(1)控制器接口,定義了兩種狀態(tài)的控制姻乓。

(2)具體控制器實(shí)現(xiàn)嵌溢,實(shí)現(xiàn)狀態(tài)的切換眯牧。

(3)狀態(tài)接口

(4)開(kāi)機(jī)狀態(tài)

(5)關(guān)機(jī)狀態(tài)

五、實(shí)戰(zhàn)使用技巧

在我們平時(shí)開(kāi)發(fā)的App應(yīng)用中赖草,肯定缺少不了登錄功能学少。App客戶(hù)端用戶(hù)狀態(tài)一般處于兩種狀態(tài):

(1)登錄狀態(tài)

(2)注銷(xiāo)狀態(tài)(退出本次登錄)

兩種狀態(tài)下對(duì)應(yīng)的App權(quán)限是不同的。例如秧骑,App中有商品的收藏版确、分享功能、加入購(gòu)物車(chē)乎折、支付功能等等绒疗。

用戶(hù)未登錄狀態(tài)時(shí),可以進(jìn)行商品分享操作骂澄,但不能對(duì)商品進(jìn)行支付吓蘑。反之,在用戶(hù)登錄后酗洒,即可進(jìn)行商品收藏士修,商品下單支付等操作。

一般的做法是樱衷,會(huì)在每個(gè)功能模塊下棋嘲,在業(yè)務(wù)處理前,例如在收藏功能模塊中矩桂,首先會(huì)對(duì)用戶(hù)的狀態(tài)進(jìn)行判斷沸移,如果用戶(hù)處于登錄狀態(tài),處理收藏邏輯侄榴。否則跳轉(zhuǎn)到登錄界面雹锣,提示用戶(hù)登錄。如果功能模塊較少的情況下癞蚕,還是可以接受蕊爵。

考慮一種場(chǎng)景:用戶(hù)狀態(tài)切換不同的情況下,會(huì)有多種不同的狀態(tài)操作桦山。此時(shí)需要在每個(gè)地方去做登錄狀態(tài)的判斷攒射,顯而易見(jiàn),這種方式非常繁瑣恒水。在后面的工作中会放,如果還有與用戶(hù)狀態(tài)相關(guān)的操作,都需要去作重復(fù)的業(yè)務(wù)邏輯钉凌。

偽代碼:

了解到使用一般方式的弊端后咧最,我們可以使用狀態(tài)模式來(lái)解決此問(wèn)題。經(jīng)過(guò)上面的分析,我們可以得到如下信息:

(1)用戶(hù)信息

(2)用戶(hù)狀態(tài)

(3)狀態(tài)行為

1.首先定義兩種狀態(tài)矢沿,兩種狀態(tài)對(duì)應(yīng)了不同的行為方式:

2.狀態(tài)行為管理

3.Activity中使用

分析:

首先滥搭,定義了兩個(gè)具體的狀態(tài)類(lèi),并且實(shí)現(xiàn)了不用的行為處理方式咨察。在登錄狀態(tài)下论熙,可以進(jìn)行收藏和支付福青。在未登錄狀態(tài)下摄狱,執(zhí)行收藏和支付行為時(shí),直接跳轉(zhuǎn)到登錄界面无午。

然后媒役,為了不在Activity直接操作State的行為,避免了Activity和State耦合宪迟,引入了LoginContext單例類(lèi)酣衷,以委托的方式通過(guò)狀態(tài)類(lèi)來(lái)管理State的行為和狀態(tài)。

最后在Activity中通過(guò)LoginContext來(lái)執(zhí)行具體操作:

首先默認(rèn)狀態(tài)是未登錄狀態(tài)次泽,此時(shí)點(diǎn)擊收藏和支付將跳轉(zhuǎn)到登錄界面穿仪。等點(diǎn)擊登錄后,狀態(tài)變?yōu)榈卿洜顟B(tài)意荤,點(diǎn)擊收藏或者支付將會(huì)進(jìn)行具體我邏輯處理啊片。

我們可以發(fā)現(xiàn),整體代碼邏輯上變得如此清晰玖像,去掉了重復(fù)冗余的判斷紫谷。

六、小結(jié)

從上面的實(shí)戰(zhàn)中捐寥,不難發(fā)現(xiàn)笤昨。使用了狀態(tài)模式后,代碼邏輯變得清晰很多握恳,減少了不必要的代碼耦合瞒窒。同樣也可以發(fā)現(xiàn),狀態(tài)模式基本可以應(yīng)用在不同狀態(tài)下的同一行為的不同處理乡洼。減少了if else? 或者switch的狀態(tài)判斷以及邏輯耦合崇裁。但是也同樣增加了類(lèi)和對(duì)象的個(gè)數(shù)。所以還需要我們?cè)趯?shí)際運(yùn)用中根據(jù)需求來(lái)決策具體的使用方式就珠。以上部分內(nèi)容參考《Android源碼設(shè)計(jì)模式》寇壳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妻怎,隨后出現(xiàn)的幾起案子壳炎,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匿辩,死亡現(xiàn)場(chǎng)離奇詭異腰耙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)铲球,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)挺庞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人稼病,你說(shuō)我怎么就攤上這事选侨。” “怎么了然走?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵援制,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我芍瑞,道長(zhǎng)晨仑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任拆檬,我火速辦了婚禮洪己,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竟贯。我一直安慰自己答捕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布澄耍。 她就那樣靜靜地躺著噪珊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪齐莲。 梳的紋絲不亂的頭發(fā)上痢站,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音选酗,去河邊找鬼阵难。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芒填,可吹牛的內(nèi)容都是我干的呜叫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼殿衰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼朱庆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起闷祥,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤娱颊,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體箱硕,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拴竹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剧罩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栓拜。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖惠昔,靈堂內(nèi)的尸體忽然破棺而出幕与,到底是詐尸還是另有隱情,我是刑警寧澤舰罚,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布纽门,位于F島的核電站,受9級(jí)特大地震影響营罢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饼齿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一饲漾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缕溉,春花似錦考传、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至枉层,卻和暖如春泉褐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸟蜡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工膜赃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揉忘。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓跳座,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親泣矛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子疲眷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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