設(shè)計模式之禪——設(shè)計模式(二)

代理模式(委托模式)

  • 定義:為其他對象提供一種代理以控制控制對這個對象的訪問掰派。
  • 簡而言之:我拿著你的實例,調(diào)用你的方法,替你操作或者管理生兆。
image.png

優(yōu)點

  • 職責(zé)清晰
  • 高擴展性:
    因為代理類也實現(xiàn)了抽象主題接口瓷马,所以拴还,真實主題需要調(diào)用的方法,代理類里面都能夠去調(diào)用欧聘。
  • 智能化:待補充片林。

擴展

  • 普通代理
    1、簡單來講就是客戶端只能訪問代理角色怀骤,而不能訪問真實角色费封。
    2、可以理解沒代理類包裹真實類晒喷,并且真實類無法被單獨調(diào)用孝偎。
    3、真實主題類可以再代理類中實現(xiàn)凉敲。

  • 強制代理
    通過真實的角色找到代理類衣盾。只有調(diào)用真實獲得的代理類才能對象真實類進行操作寺旺。eg:你找一個老板做交易,老板要求你找他的秘書势决。他不管這類事情阻塑。

  • 動態(tài)代理
    在實現(xiàn)階段不用關(guān)心代理誰,而在運行階段才指定代理哪個對象(自己寫代理的方式都是靜態(tài)代理)果复。
    總結(jié):利用java自帶的接口陈莽,實現(xiàn)一個代理類,然后進行調(diào)用虽抄∽吒椋可以根據(jù)場景,進行封裝管理迈窟。

原型模式

  • 定義:用原型來創(chuàng)建指定對象種類私植,通過拷貝該對象在內(nèi)存中的數(shù)據(jù)創(chuàng)建新的對象。
  • 自我理解:對象通過實現(xiàn)Cloneable接口车酣,通過重寫clone方法曲稼,讓該對象能夠通過調(diào)用clone方法實現(xiàn)內(nèi)存拷貝,并且創(chuàng)建一個新的實例湖员。(克隆的過程贫悄,即新對象產(chǎn)生的過程是從堆內(nèi)存中以二進制流的方式進行拷貝原對象,重新分配一個內(nèi)存塊娘摔,因此構(gòu)造方法不會被調(diào)用窄坦。)


    image.png

淺拷貝

  • 淺拷貝:實現(xiàn)中只進行對象克隆的時候,對于私有成員變量晰筛,新克隆出的對象的私有成員變量的引用是原型對象的成員變量地址猖吴。
  • 注意:能夠被拷貝的成員變量必須滿足一下兩點才能夠被拷貝岸夯。
    1雕薪、必須是成員變量纲岭,而不失方法內(nèi)變量。
    2怜瞒、可變的父泳。如果是原始數(shù)據(jù)類型,或者final對象的話也無法拷貝吴汪。

深拷貝

  • 為了讓原型對象和克隆對象的私有成員變量引用分開來惠窄,讓他們擁有自己單獨的成員變量對象。需要對成員變量進行clone賦值漾橙「巳冢克隆后,克隆對象的成員變量狀態(tài)是克隆時刻原型對象的狀態(tài)霜运。
  • 注意:克隆中脾歇,clone和final是不能同時引用的蒋腮,當final修飾的時候,成員變量無法進行深度拷貝藕各。
中介這模式(調(diào)停者模式)
  • 官方定義:用一個中介對象封裝一系列的對象交互池摧,中介者使各對象不需要顯示地互相作用,從而使其耦合松散激况,并且可以獨立地改變他們之間的交互作彤。
  • 簡單來說,a b c 兩兩相互依賴乌逐,對于這種情況竭讳,創(chuàng)建一個中間,用這個中間來跟a b c進行溝通調(diào)用浙踢。使其耦合松散代咸。


    image.png
  • Mediator 抽象中介對象,定義統(tǒng)一接口成黄,各同事角色之間通信。
  • ConcreteMediator 具體中介角色逻杖,繼承抽象中介對象奋岁。
  • Colleague 同事角色,每一個Colleague必須在創(chuàng)建的時候加入中介依賴荸百。

簡單總結(jié)

  • 優(yōu)點:
    松耦合
  • 缺點:
    單同事類數(shù)量比較多的時候闻伶,業(yè)務(wù)場景比較復(fù)雜時,這個中介會顯得非常臃腫够话,邏輯關(guān)系也會變得非常復(fù)雜蓝翰。
  • 場景
    android 中的Activity其實就是一個中介、mvc框架女嘲、媒體網(wǎng)關(guān)

命令模式

  • 定義:
    將一個請求封裝成一個對象畜份,從而讓你使用不同的請求把客戶端參數(shù)化,對請求排排隊或者記錄請求日志欣尼,可以提供命令的撤銷和恢復(fù)功能爆雹。
  • 自我理解:
    自然模式下,我叫a做第一件事情愕鼓,叫b做第二件事情钙态,叫c做第三件事情,相當于一個一個的對接做事菇晃。而命令模式下册倒,我把要做的事情整理成一份命令清單,直接交給某個管理者(invoke)磺送,讓他直接統(tǒng)籌命令清單驻子。重點是把多個命令封裝成一個任務(wù)集合灿意,然后在某個場景下直接執(zhí)行吧。


    image.png
  • Receiver接受者
    跟工作任務(wù)相關(guān)需要干活的角色拴孤。一般情況下脾歧,會將receiver封裝進command中,不在receiver在場景中出現(xiàn)演熟。最終還是根據(jù)場景以及事務(wù)的關(guān)系情況看是否需要將receiver封裝鞭执。
  • Command命令
    任務(wù)集合,以及所有角色好任務(wù)的詳細的安排芒粹。
  • Invoker調(diào)用者角色
    接受命令兄纺,并且執(zhí)行命令』幔可以理解成某個管理者估脆,統(tǒng)籌的人。

其他

  • 命令撤銷
    1座云、添加新命令執(zhí)行撤銷
    2疙赠、結(jié)合備忘錄模式還原最后的狀態(tài)(后續(xù)實現(xiàn))
  • 封裝Receiver
    1、該情況適場景而定朦拖。

責(zé)任鏈模式

  • 定義:
    使多個對象都有機會處理請求圃阳,從而避免了請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連接成一條鏈璧帝,并源著這條鏈傳遞請求捍岳,知道有對象處理它或者整條鏈遍歷結(jié)束。
  • 理解:
    責(zé)任鏈和核心個人認為就是講匹配的條件由原來單個松散的個體睬隶,統(tǒng)一成一個鏈式結(jié)構(gòu)锣夹,組成一條鏈,格局next來進行條件匹配苏潜。
  • 責(zé)任鏈和if ...else if....和switch case
    他們有相似之處银萍,目的都是條件匹配。但是責(zé)任鏈跟注重鏈恤左,即條件的先后順序砖顷,一旦鏈中的一個條件不滿足,后續(xù)就沒有操作了赃梧。而else if 卻會繼續(xù)執(zhí)行滤蝠。
    責(zé)任鏈的原理應(yīng)該是和switch case是相同的。


    image.png
  • Handler
    每一個條件就是一個handler授嘀,該類里面包括了邏輯處理物咳,已經(jīng)關(guān)系設(shè)置(nexthandler),還有一些公共條件的設(shè)置蹄皱。

優(yōu)缺點

  • 優(yōu)點:有點的話览闰,隔離了請求和處理芯肤。
  • 缺點:當handler構(gòu)成的環(huán)數(shù)量太多時候,處理麻煩压鉴。第二個崖咨,該結(jié)構(gòu)類似遞歸,調(diào)試不方便有的情況油吭。

裝飾模式

  • 定義:動態(tài)地給一個對象添加而外的職責(zé)击蹲。比直接生成子類更加靈活?婉宰?
  • 自我理解:
    先說說相似歌豺,裝飾模式有點像多次繼承(繼承的替代方案)。 結(jié)構(gòu)關(guān)系:定義一個抽象類component心包,繼承該抽象類类咧,得到一個被裝飾者。定義一個基礎(chǔ)裝飾類蟹腾,該基礎(chǔ)裝飾類有兩個點:一個是要繼承抽象component痕惋,二是需要持有被修飾的對象。通過增加修飾方法或者修改內(nèi)容娃殖,實現(xiàn)修飾功能血巍。


    image.png
  • Component
    接口或者抽象類,定義最核心對象珊随,基礎(chǔ)原始數(shù)據(jù)。
  • ConcreteComponent
    具體構(gòu)件柿隙,Component的實現(xiàn)類叶洞。需要裝飾的就是它。
  • Decorator
    基礎(chǔ)修飾類禀崖。該類繼承了Component衩辟。
  • ConcreteDecorator
    具體的修飾類

summary

  • 優(yōu)點
    解耦合唄
    繼承的一個替代方案
    方便擴展
  • 缺點
    類似繼承的問題,當層數(shù)比較多的時候不方便管理波附。
  • 場景
    需要擴展一個類的某個功能
  • 動態(tài)改變功能艺晴,能增能減
  • 比較多數(shù)量的類需要擴展功能的時候,選裝飾者模式還是可以的掸屡。

策略模式(政策模式)

  • 定義:定義一組算法封寞,將每個算法都封裝起來,并且使它們之間可以互換仅财。
  • 自我理解:android中使用到的context狈究,我們通過context能夠進行多種多樣的操作,之所以能夠執(zhí)行這些操作是因為context里面封裝了各種各樣的方法供我們使用盏求。所以類似這種就是策略模式抖锥。同時亿眠,他也是java 面向?qū)ο笾?繼承和多態(tài)的體現(xiàn)。


    image.png

類圖簡單就不累贅了磅废。創(chuàng)建策略纳像,讓context封裝。場景中調(diào)用拯勉。

summary

  • 優(yōu)點
    1竟趾、算法(策略)可以自由切換。用的是一個接口或者抽象類谜喊,傳入的只要是其實例就ok了潭兽。
    2、擴展性良好斗遏,想怎么玩就怎么玩山卦。
  • 缺點
    1、策略類數(shù)量增多诵次。
    2账蓉、所有的策略類都需要對外暴露?逾一?
    上層需要知道到底有哪些策略铸本,這不是屁話么。留疑問遵堵?箱玷?

擴展

有個好玩的東西叫枚舉策略模式,沒想到枚舉還能這么玩陌宿。
直接上代碼 ==》
https://github.com/cyp206/DesignModeLearning/blob/master/contentlib/src/main/java/com/mu/zi/contentlib/strategy_method_12/EnumStrategyScene.java

適配器模式
  • 定義
    將一個類的接口變換成客戶端所期待的另一種接口锡足,從而使原本因接口不匹配而無法再一起工作的兩個類能夠在一起工作。

  • 自我理解
    兩個實體類AB壳坪,分別繼承了接口a b 〔暗茫現(xiàn)在需要將B應(yīng)用到A的應(yīng)用場景之中(A、Bbean數(shù)據(jù)內(nèi)容相同爽蝴,但是結(jié)構(gòu)不同)沐批。這個時候,就采用到適配器模式蝎亚。新建類C繼承自B實現(xiàn)接口a九孩,然后,C既可以調(diào)用B的數(shù)據(jù)发框,又能夠適應(yīng)于A的應(yīng)用場景捻撑。
    簡單來說,就是類型轉(zhuǎn)換并適應(yīng)。

  • 類圖


    image.png
  • Target
    期望接口

  • Adaptee

  • Adapter
    轉(zhuǎn)換角色

summary

  • 優(yōu)點
    1顾患、可以讓兩個沒有關(guān)系的類運行在一起番捂。
    2、增加了類的透明性江解?设预?
    3、提高了類的復(fù)用度
    4犁河、靈活性非常好
  • 場景
    1鳖枕、改模式使用于項目遵守里氏替換原則和依賴倒置原則(即面向接口編程)
    2、這種模式一般是進行糾錯處理桨螺,不是開發(fā)之初就想好了的宾符。
迭代器模式——一個要快要被移出設(shè)計模式的設(shè)計模式
  • 定義
    它提供一種方法訪問一個容器對象中各個元素,又不需要暴露對象的內(nèi)部細節(jié)灭翔。
  • 自我理解
    為了遍歷一個map魏烫,需要獲得map的迭代器。所以肝箱,迭代器就是讓你通過它來訪問集合元素的一個管理工具哄褒。
  • 類圖


    image.png
  • Iterator
    抽象迭代器定義訪問和遍歷元素的接口,first()煌张、next()呐赡、isDone()(java叫hasNext());
  • ConcreteIterator
    Iterator具體實現(xiàn)類
  • Aggregate
    抽象容器
  • ConcreteAggregate
    具體容器

summary

  • 迭代器現(xiàn)在應(yīng)用得越來越廣泛了骏融,甚至已經(jīng)成為一個最基礎(chǔ)的工具链嘀。總的來說档玻,可以了解這種思想怀泊,但是現(xiàn)在api都封裝好了,自己實現(xiàn)還麻煩窃肠,蛋疼。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刷允,一起剝皮案震驚了整個濱河市冤留,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌树灶,老刑警劉巖纤怒,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異天通,居然都是意外死亡泊窘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烘豹,“玉大人瓜贾,你說我怎么就攤上這事⌒酰” “怎么了祭芦?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長憔鬼。 經(jīng)常有香客問我龟劲,道長,這世上最難降的妖魔是什么轴或? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任昌跌,我火速辦了婚禮,結(jié)果婚禮上照雁,老公的妹妹穿的比我還像新娘蚕愤。我一直安慰自己,他們只是感情好囊榜,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布审胸。 她就那樣靜靜地躺著,像睡著了一般卸勺。 火紅的嫁衣襯著肌膚如雪砂沛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天曙求,我揣著相機與錄音碍庵,去河邊找鬼。 笑死悟狱,一個胖子當著我的面吹牛静浴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挤渐,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苹享,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浴麻?” 一聲冷哼從身側(cè)響起得问,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎软免,沒想到半個月后宫纬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡膏萧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年漓骚,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝌衔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝌蹂,死狀恐怖噩斟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叉信,我是刑警寧澤亩冬,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站硼身,受9級特大地震影響硅急,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜佳遂,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一营袜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丑罪,春花似錦荚板、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至煤搜,卻和暖如春免绿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背擦盾。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工嘲驾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迹卢。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓辽故,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腐碱。 傳聞我的和親對象是個殘疾皇子誊垢,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

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