適配器模式和代理模式的區(qū)別
代理模式
組成:
抽象角色:通過接口或抽象類聲明真實(shí)角色實(shí)現(xiàn)的業(yè)務(wù)方法。
代理角色:實(shí)現(xiàn)抽象角色,是真實(shí)角色的代理,通過真實(shí)角色的業(yè)務(wù)邏輯方法來實(shí)現(xiàn)抽象方法,并可以附加自己的操作。
真實(shí)角色:實(shí)現(xiàn)抽象角色,定義真實(shí)角色所要實(shí)現(xiàn)的業(yè)務(wù)邏輯,供代理角色調(diào)用。
即Proxy Pattern,23種常用的面向?qū)ο筌浖脑O(shè)計(jì)模式之一。(設(shè)計(jì)模式的說法源自《設(shè)計(jì)模式》一書,原名《Design Patterns: Elements of Reusable Object-Oriented Software》。1995年出版,出版社:Addison Wesly Longman.Inc。該書提出了23種基本設(shè)計(jì)模式,第一次將設(shè)計(jì)模式提升到理論高度,并將之規(guī)范化。)
代理模式的定義:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。
(1)職責(zé)清晰
真實(shí)的角色就是實(shí)現(xiàn)實(shí)際的業(yè)務(wù)邏輯,不用關(guān)心其他非本職責(zé)的事務(wù),通過后期的代理完成一件完成事務(wù),附帶的結(jié)果就是編程簡(jiǎn)潔清晰。
(2)代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用,這樣起到了中介的作用和保護(hù)了目標(biāo)對(duì)象的作用。
(3)高擴(kuò)展性
適配器模式
在計(jì)算機(jī)編程中,適配器模式(有時(shí)候也稱包裝樣式或者包裝)將一個(gè)類的接口適配成用戶所期待的。一個(gè)適配允許通常因?yàn)榻涌诓患嫒荻荒茉谝黄鸸ぷ鞯念惞ぷ髟谝黄?,做法是將類自己的接口包裹在一個(gè)已存在的類中。
共有兩類適配器模式:
對(duì)象適配器模式
-- 在這種適配器模式中,適配器容納一個(gè)它包裹的類的實(shí)例。在這種情況下,適配器調(diào)用被包裹對(duì)象的物理實(shí)體。
類適配器模式
-- 這種適配器模式下,適配器繼承自已實(shí)現(xiàn)的類(一般多重繼承)。
使用的前提:
1.接口中規(guī)定了所有要實(shí)現(xiàn)的方法
2.但一個(gè)要實(shí)現(xiàn)此接口的具體類,只用到了其中的幾個(gè)方法,而其它的方法都是沒有用的。
實(shí)現(xiàn)方法
1.用一個(gè)抽象類實(shí)現(xiàn)已有的接口,并實(shí)現(xiàn)接口中所規(guī)定的所有方法,這些方法的實(shí)現(xiàn)可以都是“平庸”實(shí)現(xiàn)----空方法;但此類中的方法是具體的方法,而不是抽象方法,否則的話,在具體的子類中仍要實(shí)現(xiàn)所有的方法,這就失去了適配器本來的作用。
2.原本要實(shí)現(xiàn)接口的子類,只實(shí)現(xiàn)1中的抽象類即可,并在其內(nèi)部實(shí)現(xiàn)時(shí),只對(duì)其感興趣的方法進(jìn)行實(shí)現(xiàn)。
注意事項(xiàng)
1.充當(dāng)適配器角色的類就是:實(shí)現(xiàn)已有接口的抽象類
2.為什么要用抽象類:
此類是不要被實(shí)例化的。而只充當(dāng)適配器的角色,也就為其子類提供了一個(gè)共同的接口,但其子類又可以將精力只集中在其感興趣的地方。
模式解析
你想使用一個(gè)已經(jīng)存在的適配器模式,而他的接口不符合你的需求。你想創(chuàng)建一個(gè)可以復(fù)用的類,該類可以與其他不相關(guān)的類或不可預(yù)見的類協(xié)同工作。你想使用一些已經(jīng)存在的子類,但是不可能對(duì)每一個(gè)都進(jìn)行子類化已一匹配他們的接口,對(duì)象適配器可以適配他的父類接口。 適配器如同一個(gè)常見的變壓器,也如同電腦的變壓器和插線板之間的電源連接線,他們雖然都是3相的,但是電腦后面的插孔卻不能直接插到插線板上。
一簡(jiǎn)介
適配器模式:適配器模式(英語(yǔ):adapter pattern)有時(shí)候也稱包裝樣式或者包裝。將一個(gè)類的接口轉(zhuǎn)接成用戶所期待的。一個(gè)適配使得因接口不兼容而不能在一起工作的類工作在一起,做法是將類別自己的接口包裹在一個(gè)已存在的類中。
代理模式:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。
二困惑
設(shè)計(jì)模式總是通過增加層來進(jìn)行解耦合,提高擴(kuò)展性,但是如果我們沒法從在這個(gè)抽象維度中看出,這個(gè)層真正的抽象含義,那么我們很難搞懂一個(gè)模式真正的內(nèi)涵?我就有這個(gè)疑問,這兩個(gè)東東都是增加了一層,但是這一層有什么區(qū)別?
三理解
很明顯,適配器模式是因?yàn)樾屡f接口不一致導(dǎo)致出現(xiàn)了客戶端無法得到滿足的問題,但是,由于舊的接口是不能被完全重構(gòu)掉的,因?yàn)槲覀冞€想使用實(shí)現(xiàn)了這個(gè)接口的一些服務(wù)。那么為了使用以前實(shí)現(xiàn)舊接口的服務(wù),我們就應(yīng)該把新的接口轉(zhuǎn)換成舊接口;實(shí)現(xiàn)這個(gè)轉(zhuǎn)換的類就是抽象意義的轉(zhuǎn)換器。
就比如在java中早期的枚舉接口是Enumeraon而后定義的枚舉接口是Iterator;有很多舊的類實(shí)現(xiàn)了enumeraon接口暴露出了一些服務(wù),但是這些服務(wù)我們現(xiàn)在想通過傳入Iterator接口而不是Enumeraon接口來調(diào)用,這時(shí)就需要一個(gè)適配器,那么client就能用這個(gè)服務(wù)了(服務(wù)端只想用Iterator或者只知道這個(gè)接口)。
相比于適配器的應(yīng)用場(chǎng)景,代理就不一樣了,雖然代理也同樣是增加了一層,但是,代理提供的接口和原本的接口是一樣的,代理模式的作用是不把實(shí)現(xiàn)直接暴露給client,而是通過代理這個(gè)層,代理能夠做一些處理。