一.概念
適配器模式將一個(gè)接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。它使得原來由于接口不兼容而不能在一起工作的那些類可以一起工作。
二.UML

三.更加生動(dòng)的例子


四.實(shí)例分析
去年買了一個(gè)本本,另外給本本配了羅技G1光電套??拥氖?,光電套的鼠標(biāo)是USB接口,鍵盤是PS2接口,可我的本本卻沒有PS2接口啊。于是跑到市場,淘了一個(gè)轉(zhuǎn)接器。

于是乎,我抽象了這么幾個(gè)類。

- PS2Port(PS2接口)。
- USBPort(USB接口)。
- PS2ToUSB(對象適配器),將PS2接口裝換成USB接口。
- TestAdapter(測試類),客戶端。
PS2Port
Java代碼

- package com.zzy.adapter;
-
- /**
- * PS2接口,圓口
- * @author eason
- *
- */
- public interface PS2Port {
- public void workWithPS2();
- }
USBPort
Java代碼

- package com.zzy.adapter;
-
- /**
- * USB接口,U口
- * @author eason
- *
- */
- public interface USBPort {
- public void workWithUSB();
- }
PS2ToUSB
Java代碼

- package com.zzy.adapter;
-
- /**
- * 對象適配器
- * 將PS2接口裝換成USB接口
- * 所以此類類型是USB接口(implements USBPort) + 成員變量ps2Port
- * @author eason
- *
- */
- public class PS2ToUSB implements USBPort{
-
- private PS2Port ps2Port;
-
- public PS2ToUSB(PS2Port ps2Port) {
- this.ps2Port = ps2Port;
- }
-
- @Override
- public void workWithUSB() {
- System.out.println("轉(zhuǎn)換的關(guān)鍵在這里,本來是");
- ps2Port.workWithPS2();
- System.out.println("經(jīng)過你的轉(zhuǎn)換,現(xiàn)在是USB工作中");
- }
-
- }
TestAdapter
Java代碼

- package com.zzy.adapter;
-
- /**
- * 測試類
- * client
- * @author eason
- *
- */
- public class TestAdapter {
-
- public static void main(String[] args) {
- //1.我現(xiàn)在有一個(gè)PS2接口
- PS2Port ps2Port = new PS2Port() {
- @Override
- public void workWithPS2() {
- System.out.println("PS2工作中");
- }
- };
-
- //2.但是我需要的是一個(gè)USB接口啊,對我(client)來說,我只認(rèn)識USB接口
- //3.經(jīng)過PS2ToUSB的轉(zhuǎn)換,PS2接口變成了USB接口
- USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port);
-
- ps2ToUsbPort.workWithUSB();
-
- }
-
- }
五.對象的適配器和類的適配器
上述的適配器就是對象適配器。再看看類適配器。

PS2ToUSB,只是簡單模擬一下。因?yàn)閖ava不允許多繼承,所以java中沒有類模式的代碼,只有思想。
Java代碼

- package com.zzy.adapter;
-
- /**
- * 類適配器
- * @author eason
- *
- */
- public class PS2ToUSB implements USBPort, PS2Port{
-
- //重寫workWithUSB,把工作交給workWithPS2
- @Override
- public void workWithUSB() {
- workWithPS2();
- }
-
- }
差別就是:對象適配器實(shí)現(xiàn)了客戶端想要的接口(USB),在內(nèi)部有一個(gè)被適配對象(PS2)的引用,通過組合實(shí)現(xiàn)適配功能。類適配器實(shí)現(xiàn)了客戶端想要的接口(USB)和被適配對象接口(PS2),通過繼承來實(shí)現(xiàn)適配功能。
六.使用場景及使用感受
- 希望復(fù)用一些現(xiàn)存的類,但是接口又與復(fù)用環(huán)境要求不一致。
- 其實(shí)適配器模式有點(diǎn)無奈之舉,在前期設(shè)計(jì)的時(shí)候,我們就不應(yīng)該考慮適配器模式,而應(yīng)該考慮通過重構(gòu)統(tǒng)一接口。
七.適配器模式與裝飾者模式
它們都可以用來包裝對象,本質(zhì)區(qū)別在于
- 適配器模式:將一個(gè)接口轉(zhuǎn)換成另外一個(gè)接口。
- 裝飾者模式:不改變接口,只加入職責(zé)。