問題引出:大家生活中可能碰到的一個問題就是你新買的手機自帶的耳機是2.5接口的,不幸的是有一天你的耳機壞了,你去市面上根本就找不到2.5的耳機了,基本上是3.5接口了,沒辦法你只好買了個3.5接口的耳機,老闆告訴你:“我給你一個適配器”這不問題就解決了。 問題分析:3.5的接口的耳機在你手機上本來是沒法使用的,因爲它沒有按照2.5接口的設計啊,而現在我又想使用這幅耳機,於是乎有了“適配器(Adapter)”這個一個東西出來了。 Adapter模式的定義:把一個類的接口變換成客戶端所期待的另外一種接口,使得原本由於接口不兼容而不能再一起工作的那些類可以一起工作。 適配器模式分類:1.類的適配器模式(採用繼承實現)2.對象適配器(採用對象組合方式實現) 類的適配器類圖:
模式的構成:以問題中例子爲模型 目標抽象角色(Target):定義客戶所期待要使用的接口,我們把手機當做客戶端,客戶端所需要使用的耳機的接口是2.5的,在這裏就可以抽象出來一個2.5接口的設備(並不一定是耳機)。 源角色(Adaptee):需要被適配的接口,在這裏指的是我們從市場上買回來的那個3.5接口的耳機。 適配器角色(Adapter):用來把源接口轉換成符合要求的目標接口的設備,在這裏指的是老闆送給我們的那個“轉換器”。 客戶端(Client):這裏指的就是那個給我們帶來麻煩的手機嘍。 類的適配器如下: 示例代碼:
- public interface Target {
- public void provide2_5();
- }
- //Adaptee
- package pattern.adapter;
- public class Adaptee {
- public void provide3_5(){
- System.out.println("我是一個3.5的接口哦");
- }
- }
- //Adapter
- package pattern.adapter;
- public class Adapter extends Adaptee implements Target {
- @Override
- public void provide2_5() {
- this.provide3_5();
- }
- }
- //Client
- package pattern.adapter;
- public class CellPhoneClient {
- public static void main(String[] args) {
- Target target = new Adapter();
- //該手機只支持2.5接口的耳機
- target.provide2_5();
- }
- }
輸出結果
:我是一個3.5的接口哦
的耳機了。這就是適配器模式的作用。從輸出結果可以看出只支持2.5接口的手機成功的使用3.5
對象的適配器如下:
PS2Port
- * PS2接口,圓口
- * @author eason
- *
- */
- public interface PS2Port {
- public void workWithPS2();
- }
USBPort
- package com.zzy.adapter;
- /**
- * USB接口,U口
- * @author eason
- *
- */
- public interface USBPort {
- public void workWithUSB();
- }
PS2ToUSB
- 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("轉換的關鍵在這裏,本來是");
- ps2Port.workWithPS2();
- System.out.println("經過你的轉換,現在是USB工作中");
- }
- }
TestAdapter
- package com.zzy.adapter;
- /**
- * 測試類
- * client
- * @author eason
- *
- */
- public class TestAdapter {
- public static void main(String[] args) {
- //1.我現在有一個PS2接口
- PS2Port ps2Port = new PS2Port() {
- @Override
- public void workWithPS2() {
- System.out.println("PS2工作中");
- }
- };
- //2.但是我需要的是一個USB接口啊,對我(client)來說,我只認識USB接口
- //3.經過PS2ToUSB的轉換,PS2接口變成了USB接口
- USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port);
- ps2ToUsbPort.workWithUSB();
- }
- }