代理模式(委托模式)
- 定義:為其他對象提供一種代理以控制控制對這個對象的訪問掰派。
- 簡而言之:我拿著你的實例,調(diào)用你的方法,替你操作或者管理生兆。
優(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)用窄坦。)
淺拷貝
- 淺拷貝:實現(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)用浙踢。使其耦合松散代咸。
- 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í)行吧。
- 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是相同的。
- 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)修飾功能血巍。
- 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)。
類圖簡單就不累贅了磅废。創(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)。-
類圖
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的迭代器。所以肝箱,迭代器就是讓你通過它來訪問集合元素的一個管理工具哄褒。 -
類圖
- 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)還麻煩窃肠,蛋疼。