代理模式(委托模式)
- 定義:為其他對(duì)象提供一種代理以控制控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
- 簡(jiǎn)而言之:我拿著你的實(shí)例,調(diào)用你的方法,替你操作或者管理。

優(yōu)點(diǎn)
- 職責(zé)清晰
- 高擴(kuò)展性:
因?yàn)榇眍愐矊?shí)現(xiàn)了抽象主題接口,所以,真實(shí)主題需要調(diào)用的方法,代理類里面都能夠去調(diào)用。 - 智能化:待補(bǔ)充。
擴(kuò)展
普通代理
1、簡(jiǎn)單來(lái)講就是客戶端只能訪問(wèn)代理角色,而不能訪問(wèn)真實(shí)角色。
2、可以理解沒(méi)代理類包裹真實(shí)類,并且真實(shí)類無(wú)法被單獨(dú)調(diào)用。
3、真實(shí)主題類可以再代理類中實(shí)現(xiàn)。強(qiáng)制代理
通過(guò)真實(shí)的角色找到代理類。只有調(diào)用真實(shí)獲得的代理類才能對(duì)象真實(shí)類進(jìn)行操作。eg:你找一個(gè)老板做交易,老板要求你找他的秘書(shū)。他不管這類事情。動(dòng)態(tài)代理
在實(shí)現(xiàn)階段不用關(guān)心代理誰(shuí),而在運(yùn)行階段才指定代理哪個(gè)對(duì)象(自己寫(xiě)代理的方式都是靜態(tài)代理)。
總結(jié):利用java自帶的接口,實(shí)現(xiàn)一個(gè)代理類,然后進(jìn)行調(diào)用??梢愿鶕?jù)場(chǎng)景,進(jìn)行封裝管理。
原型模式
- 定義:用原型來(lái)創(chuàng)建指定對(duì)象種類,通過(guò)拷貝該對(duì)象在內(nèi)存中的數(shù)據(jù)創(chuàng)建新的對(duì)象。
-
自我理解:對(duì)象通過(guò)實(shí)現(xiàn)Cloneable接口,通過(guò)重寫(xiě)clone方法,讓該對(duì)象能夠通過(guò)調(diào)用clone方法實(shí)現(xiàn)內(nèi)存拷貝,并且創(chuàng)建一個(gè)新的實(shí)例。(克隆的過(guò)程,即新對(duì)象產(chǎn)生的過(guò)程是從堆內(nèi)存中以二進(jìn)制流的方式進(jìn)行拷貝原對(duì)象,重新分配一個(gè)內(nèi)存塊,因此構(gòu)造方法不會(huì)被調(diào)用。)
image.png
淺拷貝
- 淺拷貝:實(shí)現(xiàn)中只進(jìn)行對(duì)象克隆的時(shí)候,對(duì)于私有成員變量,新克隆出的對(duì)象的私有成員變量的引用是原型對(duì)象的成員變量地址。
- 注意:能夠被拷貝的成員變量必須滿足一下兩點(diǎn)才能夠被拷貝。
1、必須是成員變量,而不失方法內(nèi)變量。
2、可變的。如果是原始數(shù)據(jù)類型,或者final對(duì)象的話也無(wú)法拷貝。
深拷貝
- 為了讓原型對(duì)象和克隆對(duì)象的私有成員變量引用分開(kāi)來(lái),讓他們擁有自己?jiǎn)为?dú)的成員變量對(duì)象。需要對(duì)成員變量進(jìn)行clone賦值??寺『?,克隆對(duì)象的成員變量狀態(tài)是克隆時(shí)刻原型對(duì)象的狀態(tài)。
- 注意:克隆中,clone和final是不能同時(shí)引用的,當(dāng)final修飾的時(shí)候,成員變量無(wú)法進(jìn)行深度拷貝。
中介這模式(調(diào)停者模式)
- 官方定義:用一個(gè)中介對(duì)象封裝一系列的對(duì)象交互,中介者使各對(duì)象不需要顯示地互相作用,從而使其耦合松散,并且可以獨(dú)立地改變他們之間的交互。
-
簡(jiǎn)單來(lái)說(shuō),a b c 兩兩相互依賴,對(duì)于這種情況,創(chuàng)建一個(gè)中間,用這個(gè)中間來(lái)跟a b c進(jìn)行溝通調(diào)用。使其耦合松散。
image.png - Mediator 抽象中介對(duì)象,定義統(tǒng)一接口,各同事角色之間通信。
- ConcreteMediator 具體中介角色,繼承抽象中介對(duì)象。
- Colleague 同事角色,每一個(gè)Colleague必須在創(chuàng)建的時(shí)候加入中介依賴。
簡(jiǎn)單總結(jié)
- 優(yōu)點(diǎn):
松耦合 - 缺點(diǎn):
單同事類數(shù)量比較多的時(shí)候,業(yè)務(wù)場(chǎng)景比較復(fù)雜時(shí),這個(gè)中介會(huì)顯得非常臃腫,邏輯關(guān)系也會(huì)變得非常復(fù)雜。 - 場(chǎng)景
android 中的Activity其實(shí)就是一個(gè)中介、mvc框架、媒體網(wǎng)關(guān)
命令模式
- 定義:
將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而讓你使用不同的請(qǐng)求把客戶端參數(shù)化,對(duì)請(qǐng)求排排隊(duì)或者記錄請(qǐng)求日志,可以提供命令的撤銷和恢復(fù)功能。 -
自我理解:
自然模式下,我叫a做第一件事情,叫b做第二件事情,叫c做第三件事情,相當(dāng)于一個(gè)一個(gè)的對(duì)接做事。而命令模式下,我把要做的事情整理成一份命令清單,直接交給某個(gè)管理者(invoke),讓他直接統(tǒng)籌命令清單。重點(diǎn)是把多個(gè)命令封裝成一個(gè)任務(wù)集合,然后在某個(gè)場(chǎng)景下直接執(zhí)行吧。
image.png - Receiver接受者
跟工作任務(wù)相關(guān)需要干活的角色。一般情況下,會(huì)將receiver封裝進(jìn)command中,不在receiver在場(chǎng)景中出現(xiàn)。最終還是根據(jù)場(chǎng)景以及事務(wù)的關(guān)系情況看是否需要將receiver封裝。 - Command命令
任務(wù)集合,以及所有角色好任務(wù)的詳細(xì)的安排。 - Invoker調(diào)用者角色
接受命令,并且執(zhí)行命令??梢岳斫獬赡硞€(gè)管理者,統(tǒng)籌的人。
其他
- 命令撤銷
1、添加新命令執(zhí)行撤銷
2、結(jié)合備忘錄模式還原最后的狀態(tài)(后續(xù)實(shí)現(xiàn)) - 封裝Receiver
1、該情況適場(chǎng)景而定。
責(zé)任鏈模式
- 定義:
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免了請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連接成一條鏈,并源著這條鏈傳遞請(qǐng)求,知道有對(duì)象處理它或者整條鏈遍歷結(jié)束。 - 理解:
責(zé)任鏈和核心個(gè)人認(rèn)為就是講匹配的條件由原來(lái)單個(gè)松散的個(gè)體,統(tǒng)一成一個(gè)鏈?zhǔn)浇Y(jié)構(gòu),組成一條鏈,格局next來(lái)進(jìn)行條件匹配。 -
責(zé)任鏈和if ...else if....和switch case
他們有相似之處,目的都是條件匹配。但是責(zé)任鏈跟注重鏈,即條件的先后順序,一旦鏈中的一個(gè)條件不滿足,后續(xù)就沒(méi)有操作了。而else if 卻會(huì)繼續(xù)執(zhí)行。
責(zé)任鏈的原理應(yīng)該是和switch case是相同的。
image.png - Handler
每一個(gè)條件就是一個(gè)handler,該類里面包括了邏輯處理,已經(jīng)關(guān)系設(shè)置(nexthandler),還有一些公共條件的設(shè)置。
優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn):有點(diǎn)的話,隔離了請(qǐng)求和處理。
- 缺點(diǎn):當(dāng)handler構(gòu)成的環(huán)數(shù)量太多時(shí)候,處理麻煩。第二個(gè),該結(jié)構(gòu)類似遞歸,調(diào)試不方便有的情況。
裝飾模式
- 定義:動(dòng)態(tài)地給一個(gè)對(duì)象添加而外的職責(zé)。比直接生成子類更加靈活??
-
自我理解:
先說(shuō)說(shuō)相似,裝飾模式有點(diǎn)像多次繼承(繼承的替代方案)。 結(jié)構(gòu)關(guān)系:定義一個(gè)抽象類component,繼承該抽象類,得到一個(gè)被裝飾者。定義一個(gè)基礎(chǔ)裝飾類,該基礎(chǔ)裝飾類有兩個(gè)點(diǎn):一個(gè)是要繼承抽象component,二是需要持有被修飾的對(duì)象。通過(guò)增加修飾方法或者修改內(nèi)容,實(shí)現(xiàn)修飾功能。
image.png - Component
接口或者抽象類,定義最核心對(duì)象,基礎(chǔ)原始數(shù)據(jù)。 - ConcreteComponent
具體構(gòu)件,Component的實(shí)現(xiàn)類。需要裝飾的就是它。 - Decorator
基礎(chǔ)修飾類。該類繼承了Component。 - ConcreteDecorator
具體的修飾類
summary
- 優(yōu)點(diǎn)
解耦合唄
繼承的一個(gè)替代方案
方便擴(kuò)展 - 缺點(diǎn)
類似繼承的問(wèn)題,當(dāng)層數(shù)比較多的時(shí)候不方便管理。 - 場(chǎng)景
需要擴(kuò)展一個(gè)類的某個(gè)功能 - 動(dòng)態(tài)改變功能,能增能減
- 比較多數(shù)量的類需要擴(kuò)展功能的時(shí)候,選裝飾者模式還是可以的。
策略模式(政策模式)
- 定義:定義一組算法,將每個(gè)算法都封裝起來(lái),并且使它們之間可以互換。
-
自我理解:android中使用到的context,我們通過(guò)context能夠進(jìn)行多種多樣的操作,之所以能夠執(zhí)行這些操作是因?yàn)閏ontext里面封裝了各種各樣的方法供我們使用。所以類似這種就是策略模式。同時(shí),他也是java 面向?qū)ο笾?繼承和多態(tài)的體現(xiàn)。
image.png
類圖簡(jiǎn)單就不累贅了。創(chuàng)建策略,讓context封裝。場(chǎng)景中調(diào)用。
summary
- 優(yōu)點(diǎn)
1、算法(策略)可以自由切換。用的是一個(gè)接口或者抽象類,傳入的只要是其實(shí)例就ok了。
2、擴(kuò)展性良好,想怎么玩就怎么玩。 - 缺點(diǎn)
1、策略類數(shù)量增多。
2、所有的策略類都需要對(duì)外暴露??
上層需要知道到底有哪些策略,這不是屁話么。留疑問(wèn)??
擴(kuò)展
有個(gè)好玩的東西叫枚舉策略模式,沒(méi)想到枚舉還能這么玩。
直接上代碼 ==》
https://github.com/cyp206/DesignModeLearning/blob/master/contentlib/src/main/java/com/mu/zi/contentlib/strategy_method_12/EnumStrategyScene.java
適配器模式
定義
將一個(gè)類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無(wú)法再一起工作的兩個(gè)類能夠在一起工作。自我理解
兩個(gè)實(shí)體類AB,分別繼承了接口a b ?,F(xiàn)在需要將B應(yīng)用到A的應(yīng)用場(chǎng)景之中(A、Bbean數(shù)據(jù)內(nèi)容相同,但是結(jié)構(gòu)不同)。這個(gè)時(shí)候,就采用到適配器模式。新建類C繼承自B實(shí)現(xiàn)接口a,然后,C既可以調(diào)用B的數(shù)據(jù),又能夠適應(yīng)于A的應(yīng)用場(chǎng)景。
簡(jiǎn)單來(lái)說(shuō),就是類型轉(zhuǎn)換并適應(yīng)。-
類圖
image.png Target
期望接口Adaptee
源Adapter
轉(zhuǎn)換角色
summary
- 優(yōu)點(diǎn)
1、可以讓兩個(gè)沒(méi)有關(guān)系的類運(yùn)行在一起。
2、增加了類的透明性??
3、提高了類的復(fù)用度
4、靈活性非常好 - 場(chǎng)景
1、改模式使用于項(xiàng)目遵守里氏替換原則和依賴倒置原則(即面向接口編程)
2、這種模式一般是進(jìn)行糾錯(cuò)處理,不是開(kāi)發(fā)之初就想好了的。
迭代器模式——一個(gè)要快要被移出設(shè)計(jì)模式的設(shè)計(jì)模式
- 定義
它提供一種方法訪問(wèn)一個(gè)容器對(duì)象中各個(gè)元素,又不需要暴露對(duì)象的內(nèi)部細(xì)節(jié)。 - 自我理解
為了遍歷一個(gè)map,需要獲得map的迭代器。所以,迭代器就是讓你通過(guò)它來(lái)訪問(wèn)集合元素的一個(gè)管理工具。 -
類圖
image.png - Iterator
抽象迭代器定義訪問(wèn)和遍歷元素的接口,first()、next()、isDone()(java叫hasNext()); - ConcreteIterator
Iterator具體實(shí)現(xiàn)類 - Aggregate
抽象容器 - ConcreteAggregate
具體容器
summary
- 迭代器現(xiàn)在應(yīng)用得越來(lái)越廣泛了,甚至已經(jīng)成為一個(gè)最基礎(chǔ)的工具??偟膩?lái)說(shuō),可以了解這種思想,但是現(xiàn)在api都封裝好了,自己實(shí)現(xiàn)還麻煩,蛋疼。







