適配器模式

 

 

 

 

問題引出:大家生活中可能碰到的一個問題就是你新買的手機自帶的耳機是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)這裏指的就是那個給我們帶來麻煩的手機嘍。

類的適配器如下:

示例代碼:

  1. //Target
  2.  
  3. package pattern.adapter;

 

  1.  
  2.  
  3. public interface Target {
  4.  
  5. public void provide2_5();
  6.  
  7. }
  8.  
  9. //Adaptee
  10.  
  11. package pattern.adapter;
  12.  
  13. public class Adaptee {
  14.  
  15. public void provide3_5(){
  16.  
  17. System.out.println("我是一個3.5的接口哦");
  18.  
  19. }
  20.  
  21. }
  22.  
  23. //Adapter
  24.  
  25. package pattern.adapter;
  26.  
  27. public class Adapter extends Adaptee implements Target {
  28.  
  29. @Override
  30.  
  31. public void provide2_5() {
  32.  
  33. this.provide3_5();
  34.  
  35. }
  36.  
  37. }
  38.  
  39. //Client
  40.  
  41. package pattern.adapter;
  42.  
  43. public class CellPhoneClient {
  44.  
  45. public static void main(String[] args) {
  46.  
  47. Target target = new Adapter();
  48.  
  49. //該手機只支持2.5接口的耳機
  50.  
  51. target.provide2_5();
  52.  
  53. }
  54.  
  55. }

輸出結果

我是一個3.5的接口哦

 

的耳機了。這就是適配器模式的作用。從輸出結果可以看出只支持2.5接口的手機成功的使用3.5

對象的適配器如下:

  1. PS2Port(PS2接口)。
  2. USBPort(USB接口)。
  3. PS2ToUSB(對象適配器),將PS2接口裝換成USB接口。
  4. TestAdapter(測試類),客戶端。

PS2Port

Java代碼
  1. package com.zzy.adapter;
  2.  
  3. /**

  1.  
  2. * PS2接口,圓口
  3. * @author eason
  4. *
  5. */
  6. public interface PS2Port {
  7. public void workWithPS2();
  8. }

 

USBPort

Java代碼
  1. package com.zzy.adapter;
  2.  
  3. /**
  4. * USB接口,U口
  5. * @author eason
  6. *
  7. */
  8. public interface USBPort {
  9. public void workWithUSB();
  10. }

 

PS2ToUSB

Java代碼
  1. package com.zzy.adapter;
  2.  
  3. /**
  4. * 對象適配器
  5. * 將PS2接口裝換成USB接口
  6. * 所以此類類型是USB接口(implements USBPort) + 成員變量ps2Port
  7. * @author eason
  8. *
  9. */
  10. public class PS2ToUSB implements USBPort{
  11.  
  12. private PS2Port ps2Port;
  13.  
  14. public PS2ToUSB(PS2Port ps2Port) {
  15. this.ps2Port = ps2Port;
  16. }
  17.  
  18. @Override
  19. public void workWithUSB() {
  20. System.out.println("轉換的關鍵在這裏,本來是");
  21. ps2Port.workWithPS2();
  22. System.out.println("經過你的轉換,現在是USB工作中");
  23. }
  24.  
  25. }

 

TestAdapter

Java代碼
  1. package com.zzy.adapter;
  2.  
  3. /**
  4. * 測試類
  5. * client
  6. * @author eason
  7. *
  8. */
  9. public class TestAdapter {
  10.  
  11. public static void main(String[] args) {
  12. //1.我現在有一個PS2接口
  13. PS2Port ps2Port = new PS2Port() {
  14. @Override
  15. public void workWithPS2() {
  16. System.out.println("PS2工作中");
  17. }
  18. };
  19.  
  20. //2.但是我需要的是一個USB接口啊,對我(client)來說,我只認識USB接口
  21. //3.經過PS2ToUSB的轉換,PS2接口變成了USB接口
  22. USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port);
  23.  
  24. ps2ToUsbPort.workWithUSB();
  25.  
  26. }
  27.  
  28. }

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章