5 結構型模式之 - 適配器模式

5 結構型模式之 - 適配器模式

適配器模式的介紹:適配器模式在開發中使用率很高,適配器是將兩個不兼容的類融合在一起,它有點像粘合劑,將不同的東西通過一種轉換使得它們能夠協作起來。例如經常碰到兩個不相關的類之間進行交互,第一個解決方案是修改各自類的接口,但是如果沒有源碼或者我們不愿意為了一個應用而修改各自的接口,此時怎么辦?這種情況我們往往會使用一個Adapter,在這兩種接口之間創建一個“混血兒”接口,這個Adapter會將這兩個接口兼容,在不修改源碼的情況下滿足需求。

適配器模式的定義:適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能在一起工作

適配器使用場景:

1 系統需要使用現有的類,而此類的接口不符合系統的需要,即接口不兼容

2 想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作

3 需要一個統一的輸出接口,而輸入端的類型不可預知

?

用電源接口做例子,筆記本電腦的電源一般都是5V電壓,但是我們生活中的電線電壓一般都是220V,這個時候就出現了不匹配的情況,不軟件開發中我們稱之為接口不兼容,此時就需要適配器來進行一個接口轉換,在軟件開發中有一句話正好體現了這點:任何問題都可以加一個中間層來解決。這個層我們可以理解為這里的Adapter層,通過這層來進行一個接口轉換就達到了兼容的目的。

適配器模式分分兩種:

1)類適配器模式

2) 對象適配器模式

先說第一種類適配器模式:

?

5V電壓的接口,代碼如下:

1 /**
2  * Target角色,就是要轉換成的5V的
3  */
4 public interface FiveVolt {
5     int getVolt5();
6 }

?

220V的電壓,需要被轉換的

1 /**
2  * 220V的電壓,被轉換的類
3  */
4 public class Volt220 {
5     public int getVolt220(){
6         return 220;
7     }
8 }

?

下面是Adapter角色,將220V的電壓轉換成5V的電壓

1 /**
2  * 適配器,即有5V的,又有220V的,就像轉換頭一樣,兩邊都可以兼容
3  */
4 public class ClassVoltAdapter extends Volt220 implements FiveVolt {
5     @Override
6     public int getVolt5() {
7         return 5;
8     }
9 }

看到沒,上面的ClassVoltAdapter里面即有220V的,又有5V的,需要5V的也可以用,需要220V的也可以用。

下面是類適配器模式的測試類:

 1 /**
 2  * 下面是類適配器模式的測試類
 3  */
 4 public class ClassAdapterTest {
 5     public static void main(String[] args){
 6         test();
 7     }
 8 
 9     public static void test(){
10 
11         ClassVoltAdapter voltAdapter = new ClassVoltAdapter();
12         System.out.println(voltAdapter.getVolt5());
13 
14     }
15 
16 }

?

?

下面再來看看第二種適配器模式:對象適配器模式

首先前面的 5V的接口和220V的類還是一樣的。這里只是把代碼貼出來供方便查看的。

5V電壓的接口,代碼如下:

1 /**
2  * Target角色,就是要轉換成的5V的
3  */
4 public interface FiveVolt {
5     int getVolt5();
6 }

?

220V的電壓類

/*** 220V的電壓,被轉換的類*/
public class Volt220 {public int getVolt220(){return 220;}
}

?

下面看一下對象適配器類:主要是實現了目標接口,并且保存了一個被轉換的類的對象的引用 ,代碼如下:

 1 /**
 2  * 對象適配器,實現目標接口,保存一個被轉換對象的引用
 3  */
 4 public class ObjectVoltAdapter implements FiveVolt{
 5     //保存一個被轉換對象的引用
 6     Volt220 volt220;
 7 
 8     public ObjectVoltAdapter(Volt220 volt220){
 9         this.volt220 = volt220;
10     }
11 
12     @Override
13     public int getVolt5() {
14         return 5;
15     }
16 
17     public int getVolt220(){
18         return volt220.getVolt220();
19     }
20 }

?

下面是對象適配器模式測試類:

 1 /**
 2  * 對象適配器的測試類
 3  */
 4 public class ObjectVoltAdapterTest {
 5     public static void main(String[] args){
 6         test();
 7     }
 8 
 9     public static void test(){
10         //創建一個220V的電壓類的對象,也就是被轉換的類的對象
11         Volt220 volt220 = new Volt220();
12         //創建一個對象適配器類的對象,并且保存一個被轉換的類的對象
13         ObjectVoltAdapter voltAdapter = new ObjectVoltAdapter(volt220);
14         System.out.println(voltAdapter.getVolt5());
15     }
16 }

?

posted on 2017-04-26 20:25?九路313 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/start1225/p/6770532.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252798.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252798.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252798.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android進程保活

凡是做過幾年Android開發的,都不能不面對進程保活這一問題。特別是這兩年,面對谷歌,國內定制ROM,安全軟件等多方圍剿的情況下,app在后臺保活的難度越來越大,可以說包括QQ、微信在內的所有app,都…

治安卡口攝像機與電警抓拍機之間有什么區別?

接下來小編和大家說說它們有哪些相同和不同的地方,供大家參考。 治安卡口: 卡口攝像機主要是用于城市道路或高速公路出入口、收費站等重點治安監控地段的全天候實時檢測與記錄收費站、交通或治安檢查站等地點。 治安卡口監控系統的前端部分主要由三個單元…

https證書互信解決方案—創建私有CA并申請證書

前言 https相較于http而言有很大的安全性,當我們一個服務開啟https并與之通信時,往往需要證書的認證,如果是瀏覽器訪問服務,只要在瀏覽器內設置信任證書即可,而如果是程序內訪問服務(如java程序&#xff09…

[轉]Unity-移動設備可用的壓縮解壓縮源碼

原文:http://www.manew.com/thread-103250-1-1.html 最近在做客戶端數據的分離,不希望對項目有什么影響,也不太想用AssetBundle,太麻煩,就在網上找了找開源的C#壓縮算法,找來找去,發現不是不支持…

高亮顯示QSS文件

轉【作者:一去丶二三里 博客地址:http://blog.csdn.net/liang19890820】 簡述 語法高亮是文本編輯器用來顯示文本的,特別是源代碼,根據不同的類別來用不同的顏色和字體顯示。這個功能有助于編寫結構化的語言,例如&…

智能識別技術對電子警察設備的影響

電子警察是目前交通管理部門用的最多的一種監控管理系統。這類系統與傳統安防的監控設備有很大區別,原先的系統只能抓拍車輛圖片,準確率又低所以被交通管理部門慢慢的淘汰了,同業興創這款最新的設備系統,有它一個很優質的特點就是…

Mybatis緩存配置

pom文件配置: <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version> </dependency> <dependency><groupId>org.mybatis</groupId><artifactId>myba…

初入Linux,M35作業第一彈,500字感想

畢業以后&#xff0c;做過很多工作&#xff0c;一直比較迷茫。來這邊上課&#xff0c;其實是我的好同學推薦我來報班的&#xff0c;因為他本身是做運維的&#xff0c;運維前景還可以&#xff0c;而且我對這個也感興趣。有一種冷&#xff0c;叫你媽覺得你冷&#xff0c;明明單衣…

【轉】一篇比較清晰簡單的C++文件操作

from:http://www.vckbase.com/document/viewdoc/?id1439 用C進行簡單的文件I/O操作 原文出處&#xff1a;Simple File I/O Using C 序論 我曾發表過文件輸入輸出的文章&#xff0c;現在覺得有必要再寫一點。文件 I/O 在C中比烤蛋糕簡單多了。 在這篇文章里&#xff0c;我 會詳…

交通治安卡口監控系統解決方案

隨著社會經濟發展、城鎮建設速度的加快&#xff0c;流動人口不斷增加&#xff0c;城市中人口密度逐漸加大&#xff0c;給城市治安監管帶來很大的壓力。因此采用高清網絡攝像監控系統以科技手段提高執法監督效率&#xff0c;成為有力推進“和諧社會”構建的最有力辦法。 同業興創…

細說shiro之三:在獨立應用中使用shiro

官網&#xff1a;https://shiro.apache.org/ 1. 下載在非Web環境的獨立應用中使用Shiro時&#xff0c;只需要shiro-core組件。在Maven項目中的依賴配置如下&#xff1a; <dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</a…

高并發架構系列:Redis為什么是單線程、及高并發快的3大原因詳解

Redis的高并發和快速原因 1.redis是基于內存的&#xff0c;內存的讀寫速度非常快&#xff1b;2.redis是單線程的&#xff0c;省去了很多上下文切換線程的時間&#xff1b;3.redis使用多路復用技術&#xff0c;可以處理并發的連接。非阻塞IO 內部實現采用epoll&#xff0c;采用了…

2、C#基礎 - Visual Studio 的版本選擇和下載

有句話說&#xff1a;工欲善其事&#xff0c;必先利其器&#xff0c;我不推薦在學習一個語言時使用記事本練習&#xff0c;甚至說相當的排斥。當然了&#xff0c;你也可以選擇你自己喜歡的方式。本系列推薦使用的IDE為vs2017 community版&#xff0c;銀子不夠的同志不用怕&…

紅外攝像機的原理及選擇

一、紅外基本原理介紹 光是一種電磁波&#xff0c;它的波長區間從幾個納米&#xff08;1nm10-9m&#xff0c;十億分之一米&#xff09;到 1 毫米&#xff08;mm&#xff09;左右。人眼可見的只是其中一部分&#xff0c;我們稱其為可見光&#xff0c;可見光的波長范圍為 380nm …

第六章 預處理器

宏就是文字展開&#xff0c;實際中能夠展開寫出來發現錯誤。6.1 不能忽視宏定義中的空格 6.2 宏并非函數宏定義一個函數時&#xff0c;1、要把每一個參數用括號括起來2、同一時候也要把整個表達式括起來。3、要確保宏中的參數沒有副作用#define max(a,b) ((a)>(b)?(a):(b)…

oracle 數據庫中執行數據庫語句能找到數據,但是程序中卻抓取不到

oracle 數據庫中執行數據庫語句能找到數據&#xff0c;但是程序中卻抓取不到&#xff1f; 原因&#xff1a;數據庫中插入數據時沒有commit&#xff0c;執行COMMIT后就可以查詢到。轉載于:https://www.cnblogs.com/hanje/p/10140307.html

Python3經典100道練習題003

題目&#xff1a;一個整數&#xff0c;它加上100后是一個完全平方數&#xff0c;再加上268又是一個完全平方數&#xff0c;請問該數是多少&#xff1f; 方法&#xff1a;利用循環去判斷x100和x268是否為完全平方數&#xff0c;沒用使用其他函數&#xff0c;缺點運算速度慢 1 x-…

紅外攝像機

在監控市場中&#xff0c;紅外攝像機之所以那么受市場的歡迎&#xff0c;主要還是因為它有強勁的夜視性能。市場上&#xff0c;普通的彩色攝像機基本上沒有夜視能力&#xff0c;如果需要在夜晚獲得清晰的圖像&#xff0c;必須借助額外的可見光源照明才能實現。那么監控攝像機系…

P3375 【模板】KMP字符串匹配

題目描述 如題&#xff0c;給出兩個字符串s1和s2&#xff0c;其中s2為s1的子串&#xff0c;求出s2在s1中所有出現的位置。 為了減少騙分的情況&#xff0c;接下來還要輸出子串的前綴數組next。如果你不知道這是什么意思也不要問&#xff0c;去百度搜[kmp算法]學習一下就知道了。…

[譯] 用 Shadow DOM v1 和 Custom Elements v1 實現一個原生 Web Component

原文地址&#xff1a;Make a Native Web Component with Custom Elements v1 and Shadow DOM v1原文作者&#xff1a;Pearl Latteier譯文出自&#xff1a;掘金翻譯計劃本文永久鏈接&#xff1a;github.com/xitu/gold-m…譯者&#xff1a;newraina校對者&#xff1a;CoderMing假…