设计模式 - 适配器模式
簡(jiǎn)介
場(chǎng)景
- 現(xiàn)實(shí)場(chǎng)景:國(guó)內(nèi)電壓是 220v,外國(guó)部分國(guó)家是 110v,如果去出差,會(huì)需要攜帶兩個(gè)電源適配器,以應(yīng)對(duì)這兩種不同的電壓。
- 數(shù)據(jù)庫(kù)場(chǎng)景:每種編程語(yǔ)言都需要支持多種數(shù)據(jù)庫(kù),通常會(huì)抽象一層數(shù)據(jù)庫(kù)連接層,例如 Java 的 JDBC,PHP 的 PDO。數(shù)據(jù)庫(kù)連接層對(duì)應(yīng)用開(kāi)發(fā)人員提供標(biāo)準(zhǔn)接口,屏蔽了數(shù)據(jù)庫(kù)底層的差異。數(shù)據(jù)庫(kù)提供的接口則是千差萬(wàn)別的。所以,數(shù)據(jù)庫(kù)連接層又拆分為兩層,一層對(duì)外提供服務(wù),一層用于連接不同的數(shù)據(jù)庫(kù)。
- 具體代碼場(chǎng)景:想使用一個(gè)已經(jīng)完成的類(lèi),但是它的接口不符合需求。
假設(shè)已經(jīng)有可以提供服務(wù)的目標(biāo)類(lèi),客戶類(lèi)訪問(wèn)目標(biāo)類(lèi)時(shí),發(fā)現(xiàn)其提供的接口不滿足需求。此時(shí)在客戶類(lèi)和目標(biāo)類(lèi)中間加一層抽象,使不能直接交互的類(lèi)可以一起工作。
定義一個(gè)包裝類(lèi),包裝不兼容接口的對(duì)象,這個(gè)包裝類(lèi)指的就是適配器(Adapter),它所包裝的對(duì)象就是適配者(Adaptee),即被適配的類(lèi)。
模式定義
將一個(gè)接口轉(zhuǎn)換成客戶希望的另一個(gè)接口,使接口不兼容的那些類(lèi)可以一起工作。
模式特點(diǎn)
適配器模式包含四個(gè)角色:
Target:目標(biāo)抽象類(lèi),定義接口標(biāo)準(zhǔn),客戶端可以直接調(diào)用
Adapter:適配器類(lèi),適配 Adaptee 與 Target,使其可以協(xié)同工作
Adaptee:適配者類(lèi),需要進(jìn)行適配的接口
Client:客戶類(lèi)
適配器模式包括兩種:
- 類(lèi)結(jié)構(gòu)型適配器:繼承關(guān)系,Adapter 同時(shí)繼承 Target 和 Adaptee 類(lèi)。
- 對(duì)象結(jié)構(gòu)型適配器:關(guān)聯(lián)關(guān)系,Adapter 繼承 Target,關(guān)聯(lián) Adaptee。
優(yōu)點(diǎn)
- 符合“開(kāi)閉原則”,可以用配置文件方便地更換適配器
- 解耦,通過(guò)引入一個(gè)適配器類(lèi)來(lái)重用現(xiàn)有的適配者類(lèi)
類(lèi)適配器模式優(yōu)點(diǎn):
- Adapter 是 Adaptee 的子類(lèi),因此可以在 Adapter 中置換一些 Adaptee 的方法,使得適配器的靈活性更強(qiáng)。
對(duì)象適配器模式優(yōu)點(diǎn):
- 允許一個(gè) Adapter 與多個(gè) Adaptee 同時(shí)工作
缺點(diǎn)
類(lèi)適配器模式的缺點(diǎn):
- 對(duì)于不支持多繼承的語(yǔ)言,一次最多只能適配一個(gè) Adaptee,其使用有一定的局限性,不能將 Adaptee 和它的子類(lèi)都適配到目標(biāo)接口。當(dāng)我們想要匹配一個(gè)類(lèi)以及所有它的子類(lèi)時(shí),類(lèi) Adapter 不能勝任工作。
對(duì)象適配器模式的缺點(diǎn):
- 重定義 Adaptee 的行為比較困難。
PHP 代碼示例
類(lèi)適配器模式
<?phpinterface Target {public function query(); }class Adapter extends Adaptee implements Target {public function del() {echo "can not delete<br/>";} }class Adaptee {public function query() {echo "Adaptee query<br/>";} }class Client {public function test() {$adapter = new Adapter();$adapter->query();$adapter->del();} }$c = new Client(); $c->test();輸出:
Adaptee query can not delete對(duì)象適配器模式
<?phpinterface Target {public function query(); }class Adapter implements Target {private $adaptee;public function __construct(Adaptee $adaptee) {$this->adaptee = $adaptee;}public function query() {echo $this->adaptee->query();}public function del() {echo "can not delete<br/>";} }class Adaptee {public function query() {echo "Adaptee query<br/>";} }class Client {public function test() {$adaptee = new Adaptee();$adapter = new Adapter($adaptee);$adapter->query();$adapter->del();} }$c = new Client(); $c->test();輸出:
Adaptee query can not delete轉(zhuǎn)載于:https://www.cnblogs.com/kika/p/10851563.html
總結(jié)
以上是生活随笔為你收集整理的设计模式 - 适配器模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux学习之CentOS(三十六)-
- 下一篇: 基础知识:什么是ASP.NET Razo