設計模式之介面卡模式與外觀模式(一)
學習技術的過程總是需要慢慢積累的,所以持續學習是一個一直存在的事情。很高興,我能一直通過看書輸出設計模式相關的系列,也很感謝各位朋友的持續關注。
廢話不多說啦,今天我們繼續學習一個對於Android開發來說可能不太陌生的模式,介面卡模式和外觀模式。曾經或者現在正在做Android開發的你,是不是很熟悉這個呢?對的,Android裡很多控制元件,可都是需要介面卡來處理的噢,那我們趕緊進來看看吧。
我們周圍的介面卡
介面卡是什麼,你一定不難理解,因為現實就存在。比方說,如果你需要在歐洲國家使用美國製造的膝上型電腦,你可能需要使用一個交流電的介面卡...它的工作是將歐式插座轉換成美式插座,好讓美式插頭可以插進這個插座得到電力。
這就是真實世界的介面卡,那面向物件介面卡又是什麼?其實,介面卡和真實世界的介面卡扮演著同樣的角色:將一個介面轉換成另一個介面,以符合客戶的期望。用一個形象點的圖表示就是:
火雞轉換器
有了前面的鋪墊,我們來看下下面這個場景。如果它走起路來像只鴨子,叫起來像只鴨子,你覺得他一定是一隻鴨子嗎?現在這個答案就未必是肯定的回答了,它可能是一隻包裝了鴨子介面卡的火雞。
結合第一章的鴨子的例子,我們在這裡好好利用起來。先來看看鴨子介面和類的一個稍微簡化的版本:
// 葉子實現了Duck介面,具備呱呱叫和飛行的能力 public interface Duck { public void quack(); public void fly(); }
綠頭鴨是鴨子的子類:
public class MallardDuck implements Duck {
public void quack() {
System.out.println("Quack");
}
public void fly() {
System.out.println("I'm flying");
}
}
這裡為您介紹最新的“街頭頑禽”:
// 火雞不會呱呱叫,只會咯咯叫 public interface Turkey { public void gobble(); public void fly(); } // 火雞的具體實現 public class WildTurkey implements Turkey { public void gobble() { System.out.println("Gobble gobble"); } public void fly() { System.out.println("I'm flying a short distance"); } }
正常情況下,是按照上面的流程來就好了。但是現在如果你缺少鴨子物件,想用一些火雞物件來冒充。但是兩個根本不是同一個東西,怎麼冒充呢?介面卡模式的威力就來了。
// 首先,你需要實現想轉換成的型別介面,也就是你的客戶所期望看到的介面
public class TurkeyAdapter implements Duck {
Turkey turkey;
// 接著,需要取得介面卡的物件引用
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
// 我們需要實現介面中的方法。quack()在類之間的轉換,只需要呼叫gobble即可
public void quack() {
turkey.gobble;
}
public void fly() {
for(int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
測試介面卡
public class DuckTestDrive {
public static void main(String[] args) {
// 建立一隻鴨子
MallardDuck duck = new MallardDuck();
// 建立一隻火雞
WildTurkey turkey = new WildTurkey();
// 將火雞包裝進一個火雞的介面卡中,使他看起來像一隻鴨子
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("The Turkey says...");
// 測試這隻火雞
turkey.gobble();
turkey.fly();
// 測試鴨子,傳入一個鴨子物件
System.out.println("\nThe Duck says...");
testDuck(duck);
System.out.println("\nThe TurkeyAdapter says...");
// 重點在這,我們傳入一個假裝是鴨子的火雞
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}
介面卡模式解析
看了上面的例子,是不是覺得介面卡很神奇呢。通過以假換真的方式實現了火雞帶鴨子的功能。那我們來看下,到底是怎麼一回事
客戶使用介面卡的過程如下:
- 客戶通過目標介面呼叫介面卡的方法對介面卡發出請求
- 介面卡使用被適配者介面請求轉換成被適配者的一個或多個呼叫介面
- 客戶接收到呼叫的結果,但並未察覺這一切是介面卡在起轉換作用
定義介面卡模式
玩夠了鴨子、火雞和交流電介面卡,現在讓我們進入真實世界,並看看介面卡模式的正式定義:
介面卡模式將一個類的介面,轉換成客戶期望的另一個介面,介面卡讓原本介面不相容的類可以合作無間。
轉換成類圖就是:
這個介面卡模式充滿著良好的OO設計原則:使用物件組合,以修改的介面包裝被適配者;這種做法還有額外的優點,那就是,被適配者的任何子類,都可以搭配著介面卡使用。
也請留意,這個模式是如何把客戶和介面繫結起來,而不是和實現繫結起來的。我們可以使用數個介面卡,每一個都負責轉換不同組的後臺類。或者,也可以加上新的實現,只要它們遵循目標介面就可以。
哈哈,講到這裡介面卡模式差不多就介紹完了。小編曾經寫Android的時候,都不知道介面卡是啥東西,只知道盲目的使用。學了設計模式,終於知道介面卡是幹嘛 用的了。Andorid世界裡,那麼多需要使用介面卡的控制元件,你現在清楚了嗎?
下次我們將介紹外觀模式,我們下次再會。
愛生活,愛學習,愛感悟,愛挨踢
相關推薦
django之ORM介紹與基本用法(一)
一、ORM介紹 1.什麼是ORM ORM 全拼Object-Relation Mapping. 中文意為 物件-關係對映. 在MVC/MVT設計模式中的Model模組中都包括ORM 2.ORM優勢 (1)只需要面
從零開始學C++之虛擬函式與多型(一):虛擬函式表指標、虛解構函式、object slicing與虛擬函式、C++物件模型圖
#include <iostream>using namespace std;class CObject {public: virtual void Serialize() { cout << "CObject::Serialize ..." <&
JavaScript設計模式基礎之面向對象的JavaScript(一)
UNC 靈活 我們 靜態 type n) object 模式 string 動態語言類型與鴨子類型 此內容取自JavaScript設計模式與開發實踐一書 編程語言按照數據類型大體可以分為2類,一類就是靜態類型語言,另一類則是動態類型語言 靜態類型語言也可以稱之為編譯語言,而
設計模式講解與程式碼實踐(一)——抽象工廠
摘要:本文講解了抽象工廠(Abstract Factory)設計模式的使用目的、基本形態及各參與者,並結合示例程式碼,講解了該設計模式在具體業務場景下的使用。 1 目的 抽象工廠(Abstract Factory)用於提供一個建立一組無需指定具體類的
模式識別與機器學習筆記專欄之貝葉斯分類決策(一)
[toc] > 這是模式識別與機器學習筆記專欄的第一篇,我會持續更新。 在所有的生活場景中,我們無時無刻不在進行著模式識別。比如你看見迎面走來一個人,根據他的長相來辨認出他好像是你一年前某個活動小組的組長,然後你開始決策要不要和他打個招呼。或者你走進水果店,把西瓜拍了個遍來決定最後買哪一個。或者你突
模式識別與機器學習(一):概率論、決策論、資訊理論
本系列是經典書籍《Pattern Recognition and Machine Learning》的讀書筆記,正在研讀中,歡迎交流討論。 基本概念 1. 模式識別(Pattern Recognition):是指通過演算法自動發現數據的規律,並進行資料分類等任務。
javascript常用設計模式介紹,實現及實際應用(一)
javascript設計模式介紹,實現及實際應用(一) 本文將介紹javascript中常用的設計模式原理和實現,並結合例項講解其應用。 本篇文章先介紹單例模式,策略模式,代理模式,釋出訂閱模式和命令模式,其它幾種模式後續文章將繼續介紹。 1、單例模式 單例模式
C之有符號與無符號(二)
C語言 有符號數 無符號數 我們在 C 語言中經常會見到 unsigned 關鍵字,那麽這是什麽意思呢?在計算機內,數據類型分為有符號和無符號兩種類型。它的最高位用於標識數據的符號:如果最高位為 1,表明這個數為負數;如果是0的則表明這個數為正數。那麽我們就來做個試驗驗證下,代碼如
理解異步之美:Promise與async await(一)
進行 這就是我 按順序 script 做的 sea rip pre 每次 你可能會放出一個怪物 異步與同步相比,最難以掌控的就是異步的任務會什麽時候完成和完成之後的回調問題, 難以掌控的觸發狀態,讓你自己寫的代碼當時還可以讀懂,但是過幾天、半個月之後如果不重新盤一邊邏輯,你
從壹開始微服務 [ DDD ] 之六 ║聚合 與 聚合根 (下)
前言 哈嘍大家週二好,上次咱們說到了實體與值物件的簡單知識,相信大家也是稍微有些瞭解,其實實體咱們平時用的很多了,基本可以和資料庫表進行聯絡,只不過值物件可能不是很熟悉,值物件簡單來說就是在DDD領域驅動設計中,為了更好的展示領域模型之間的關係,制定的一個物件,它沒有狀態和標識,目的就是為了表示一個值。今天
Android-PickerView系列之介紹與使用篇(一)
宣告:本文為博主原創文章,轉載請註明出處:小嵩的部落格 一、介紹 Android-PickerView是一款仿iOS的PickerView控制元件,並封裝了時間選擇和選項選擇這兩種選擇器,詳細特性如下: WheelView —— 基礎控制元件
shell命令之檔案壓縮與解壓(常用)
.tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是壓縮!) .gz 解壓1:gunzip FileName.gz 解壓2:gzip -d Fil
JAVA:IO流 之 節點流與處理流(2)
1. 流的分類 按資料流的方向不同:輸入流,輸出流。 按處理資料單位不同:位元組流,字元流。 (1) 位元組流:資料流中最小的資料單元是位元組。 (2)字元流:資料流中最小的資料單元是字元, Java中的字元是Unicode編碼,一個字元佔用兩個位元組。
FPGA之同步復位與非同步復位(1)
正常情況下,clk的上升沿c更新為b,b更新為a。一旦進入復位,b,c都清零;但是我們不能確定復位訊號rst_n會在什麼時候結束。如果結束於b_reg0和c_reg0的{launch edge –stup,launch edge+hold}時間只外,那麼一切都會正常。但如果恰恰相反,會出現什麼情況呢? rst
計算機演算法設計與分析——遞迴與分治策略(一)
遞迴: 直接或者間接地呼叫自身的演算法稱為遞迴。用函式自身給出定義的函式成為遞迴函式。 使用遞迴技術往往使函式的定義和演算法的描述簡潔且易於理解。有些資料結構,如二叉樹等,由於其本身固有的遞迴特性,特別適合用遞迴的形式來描述。另外,還有一些問題,雖然其本身沒
FPGA之同步復位與非同步復位(2)
為了避免純粹的同步復位和純粹非同步復位的問題,可以使用一種叫做同步化的非同步復位,我們稱其為第三類復位。這種復位完全結合了非同步復位和同步復位的優勢,我們知道非同步復位的優勢是不參與資料路徑,所以不影響資料路徑速度,而復位幾乎是瞬間起作用;而同步復位的優勢是百分百地同步時
【OpenCV入門教程之十】 形態學影象處理(一):膨脹與腐蝕
本系列文章由@淺墨_毛星雲 出品,轉載請註明出處。 寫作當前博文時配套使用的OpenCV版本: 2.4.8本篇文章中,我們一起探究了影象處理中,最基本的形態學運算——膨脹與腐蝕。淺墨在文章開頭友情提醒,用人物照片做腐蝕和膨脹的素材圖片得到的效果會比較驚悚,毀三觀的,不建議嘗試
資料庫設計與效能優化(一)
** 良好的資料庫設計能夠 **: 節省資料的儲存空間。 能夠保證資料的完整性。 方便進行資料庫應用系統的開發。 糟糕的資料庫設計: 資料冗餘、儲存空間浪費。 記憶體空間浪費。 資料更新和插入異常麻煩。 資料庫的生命週期: 1、需求分析
jQuery 之 選擇器與事件型別(二)
hover() hover()方法用於模擬游標懸停事件.當滑鼠移動到元素上時,會觸發指定的第一個函式(mouseenter);當滑鼠移出這個元素時,會觸發指定的第二個函式(mouseleave)。 例項 $("#p1").hover(function(){ alert("You entered p1!")
無線通訊網路學習之E-UTRAN與EPC篇(20141209)
今天來介紹一下E-UTRAN和EPC中網元架構方面的知識: 首先來參考一下下面的一張拓撲圖: 從圖中可以看出,E-UTRAN是使用者的移動終端(UE)與基站eNodeB組成; 負責無線訊號控制與資料處理,無線資源管理(Radio Resource Manageme