1. 程式人生 > >設計模式(java)- 介面卡模式

設計模式(java)- 介面卡模式

1. 簡介

  介面卡模式是將兩個介面不相容的類連線在一起,使其可以進行工作,它是一種結構性設計模式。它主要為了滿足客戶需要的介面,通過中間的適配層來匹配使用者所需要的功能。
  例如,我們在維護老的專案的時候,B組重構了自己組內的程式碼,此時他們也需要修改自己的介面名,但是這些介面A組有呼叫,那麼這個時候我們不能直接要求A組也跟著改呼叫介面的程式碼,因為如果將介面名全部修改為B組提供的,那會花費很長時間,且容易出錯。這個時候就可以使用介面卡模式將兩個組的介面適配到一起,從而在不影響A組程式碼的情況下,重構了本組的程式碼,並且兩組所維護的程式碼邊界也很清晰,也方便各自的維護。
  再如,我們常常遇到這樣的情景:一個房間內只有三孔的插口,而我的電源線是兩孔的。那麼這時我就需要一個三孔的電源介面卡,適配我的兩孔電源線。此時,這個介面卡一端是兩孔插口,一端是插向三孔的介面。這個就是介面卡模式。
  再如,在開發中,我們會遇到與硬體驅動通訊的情況。那麼在沒有真實的硬體驅動的時候,為了不影響專案開發進度,就需要一個模擬的驅動介面。這樣,做驅動層的開發人員和做應用的開發人員可以並行的完成自己的開發內容。當在沒有真實驅動的時候,我可以使用我的模擬來進行除錯,當有真實驅動的時候我就可以切換到真實驅動介面進行除錯。這種介面介面卡也屬於介面卡模式。
  介面卡模式分為:類介面卡、物件介面卡、介面介面卡。

2. 類圖

  如下,分三種UML類圖分別表示介面卡模式的三種方式。

2.1 類介面卡

在這裡插入圖片描述

2.2 物件介面卡

在這裡插入圖片描述

2.3 介面介面卡

在這裡插入圖片描述

  從上圖我們可以看到,類介面卡和物件介面卡本質是一樣的,只是實現的方式不一樣。一個使用繼承的方式,一個使用聚合的方式。一般的,我們更多的使用物件介面卡。而介面介面卡,就適用於例舉的第三個例子。

3. 例項

  同樣的,使用程式碼示例來說明這三種介面卡模式實現的基本方式。

3.1 類介面卡

interface IThreeHoleSocket {
	public void connectThreeHole();
}

interface ITwoHolePowerCord
{ public void connectTwoHole(); } class EThreeHoleSocket implements IThreeHoleSocket { public void connectThreeHole() { System.out.println("Successful connection to the three-hole power cord!"); } } class ETwoHolePowerCord implements ITwoHolePowerCord { public void connectTwoHole() { System.
out.println("Successful connection to the two-hole socket!"); } }

  如上,分別有一個三孔插座和一個兩孔的電源線,那麼怎麼讓兩孔的電源線使用三孔的插座呢。這裡就用到了一個介面卡,將兩者聯絡起來:

class EThreeHoleClassAdapter extends EThreeHoleSocket implements ITwoHolePowerCord {
	public void connectTwoHole() {
		connectThreeHole();
	}
}

  客戶程式碼:

		ITwoHolePowerCord threeHoleClassAdapter = new EThreeHoleClassAdapter();
		threeHoleClassAdapter.connectTwoHole();

  輸出:

Successful connection to the three-hole power cord!

3.2 物件介面卡

  物件介面卡與類介面卡不同的時候,它使用聚合的方式,在介面卡中存在需要適配的物件的引用,然後通過呼叫適配物件的方法來適配使用者需要的介面。

class EThreeHoleObjectAdapter implements ITwoHolePowerCord {
	private EThreeHoleSocket threeHoleSocket;
	
	public EThreeHoleObjectAdapter(EThreeHoleSocket threeHoleSocket) {
		this.threeHoleSocket = threeHoleSocket;
	}
	
	public void connectTwoHole() {
		threeHoleSocket.connectThreeHole();
	}
}

  客戶程式碼:

		EThreeHoleSocket threeHoleSocket = new EThreeHoleSocket(); 
		ITwoHolePowerCord threeHoleObjectAdapter = new EThreeHoleObjectAdapter(threeHoleSocket);
		threeHoleObjectAdapter.connectTwoHole();

  輸出與類介面卡一樣。可以發現,物件介面卡的耦合度是小於類介面卡的,所以建議更多的使用物件介面卡。

3.3 介面介面卡

  根據簡介中的第三個例子,有下面的程式碼示例:

interface IDriver {
	void funcA();
	void funcB();
	void funcC();
	void funcD();
}

abstract class EDriver implements IDriver {
	public void funcA() {}
	public void funcB() {}
	public void funcC() {}
	public void funcD() {}
}

class ESimDriver extends EDriver {
	public void funcB() {
		System.out.println("this is Sim funcB!");
	}
	
	public void funcC() {
		System.out.println("this is Sim funcC!");
	}
}

class ERealDriver extends EDriver {
	
	public void funcA() {
		System.out.println("this is Real funcA!");
	}
	
	public void funcB() {
		System.out.println("this is Real funcB!");
	}
	
	public void funcC() {
		System.out.println("this is Real funcC!");
	}
	
	public void funcD() {
		System.out.println("this is Real funcD!");
	}
}

  如上,有一個驅動介面類IDriver,抽象類EDriver,以及具體的模擬驅動類ESimDriver和真實驅動類ERealDriver 。那麼為什麼中間要加一個抽象類EDriver呢,這是因為模擬類中可能實現了部分的介面方法,這樣使得具體的類更加的靈活選擇自己要實現的方法。
  客戶程式碼:

		IDriver simDriver = new ESimDriver();
		simDriver.funcA();
		simDriver.funcB();
		simDriver.funcC();
		simDriver.funcD();
		
		IDriver realDriver = new ERealDriver();
		realDriver.funcA();
		realDriver.funcB();
		realDriver.funcC();
		realDriver.funcD();

  輸出:

this is Sim funcB!
this is Sim funcC!
this is Real funcA!
this is Real funcB!
this is Real funcC!
this is Real funcD!

總結

  介面卡模式相對也比較簡單,但應用的場景比較多,在專案中我們會經常使用到該設計模式。

相關推薦

設計模式java- 介面卡模式

1. 簡介   介面卡模式是將兩個介面不相容的類連線在一起,使其可以進行工作,它是一種結構性設計模式。它主要為了滿足客戶需要的介面,通過中間的適配層來匹配使用者所需要的功能。   例如,我們在維護老的專案的時候,B組重構了自己組內的程式碼,此時他們也需要修改自己

Java設計模式5--介面卡模式

介面卡模式主要是用於補救的,為什麼這麼說呢,拿上一章的觀察者模式來說: 1、jdk中的觀察者Observer,是一個介面,如果我們有一個類Male,要實現觀察者的功能,那麼直接實現Observer介面即可,但是,如果需要是,既要有Observer的功能,也要有

設計模式介面卡模式Adapter結構型

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

PHP設計模式2—— 介面卡模式

介面 我們先來看看介面的作用 interface Database{ public function connect(); public function query(); public function close(); } class Mysql i

設計模式Java—Facade模式

使用Facade模式可以為互相關聯在一起的錯綜複雜的類整理出高層介面,其中的Facade角色可以讓系統對外只有一個簡單的介面。 示例程式 該程式只有三個簡單類,一個是用於從郵件地址中獲取使用者名稱字的資料庫類,一個用於編寫HTML檔案的類,以及一個扮演Facad

設計模式Java—Command模式

一個類在進行工作時會呼叫自己或是其他類的方法,雖然呼叫結果會反映在物件的狀態中,但是並不會留下工作的歷史紀錄。 這時,如果有一個類,用來表示進行這項工作的命令就會方便很多。每一項想做的工作就不再是方法的呼叫這種動態處理了,而是一個表示命令的類的例項,既可以用物來

設計模式——介面卡模式

介面卡模式:將一個類的介面,轉換成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以無間合作。          這個模式可以建立介面卡進行介面轉換,讓不相容的介面變成相容。 這個模式主要有四個部分: Client:客戶 Target:目標介面 A

設計模式—— 介面卡模式

1. 介紹 介面卡模式是把一個類的介面變換成客戶端的所期待的另一個介面,從而使原本因介面不匹配而無法在一起工作的兩個類能夠在一起工作。 2. 分類 介面卡模式有類的介面卡模式和物件的介面卡模式兩種形式。 2.1 類的介面卡模式 類的介面卡模式是把適配的類的API轉換成為目標類的A

設計模式java- 原型模式

1. 簡介   原型模式又稱克隆模式,它允許一個物件可以創建出另一個與自身型別相同的物件。客戶不需要知道建立的細節,就可以獲取到需要的複製品。   在java中通過繼承Cloneable的介面實現原型模式,在c++中則可以通過過載賦值函式進行實現。   在實現原

設計模式------介面卡模式

介紹 介面卡模式(Adapter Pattern)是作為兩個不相容的介面之間的橋樑。這種型別的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。 這種模式涉及到一個單一的類,該類負責加入獨立的或不相容的介面功能。舉個真實的例子,讀卡器是作為記憶體卡和筆記本

golang設計模式6介面卡模式

介面卡模式設計意圖 將一個型別的介面轉換成客戶希望的另外一個介面,使原本由於介面不相容而不能一起工作的類可以一起工作。 適用性 .想適用一個已經存在的型別,而其介面不符合需求 .建立一個可以複用的型別,該型別可以與其他不相關的型別或不可預見的型別協同工作

設計模式—— 介面卡模式

一、含義 將一個類的介面,轉換成客戶期望的另一個介面。介面卡讓原本介面不相容的類可以合作無間,也就是說介面卡模式是在原有一個類的基礎上,在不改變這個類的程式碼時,新建一個類將其原來的類,進行封裝改變,以符合新的需求。 二、要點 1.當需要使用一個現有的類而其介面並不符合

設計模式Java—Interpreter模式

在Interpreter模式中,程式要解決的問題會被用非常簡單的“迷你語言”表述出來,即用“迷你語言”編寫的“迷你程式”把具體問題表述出來。迷你程式是無法單獨工作的,我們還需要用Java語言編寫一個負責“翻譯”的程式。翻譯程式會理解迷你語言,並解釋和執行迷你程式

設計模式介面卡模式

一、問題引入 說起介面卡其實在我們的生活中是非常常見的,比如:如果你到日本出差,你會發現日本的插座電壓都是110V的,而我們的手機充電器和筆記本充電器都是220V,所以你到了日本之後就沒辦法充電了,這時候我們通常會怎麼辦呢,當然是使用一個升壓的變壓器將電壓升高

java設計模式工廠模式

額外 mod 通過反射 pat 擴展 簡單實現 需要 factory actor   工廠模式是最常見的實例化對象的模式,用來替代new操作。采用這種模式創建對象會有一些額外的操作,但他會帶給系統更大的擴展性和更少的修改量。典型的應用spring bean容器。下面簡單實現

java設計模式模板模式

pro str pan style coff pub 調用 類定義 ted   抽象類中公開定義了執行它的方法的方式,子類可以按需求重寫方法實現,但調用將以抽象類中定義的方式進行,典型應用如銀行辦理業務流程、沖泡飲料流程。下面給出簡單例子,用沸水沖泡飲料,分為四步:將水煮沸

java設計模式策略模式

() pan win with blog trac java設計模式 ring ide   策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們可以相互替換,讓算法獨立於使用它的客戶而獨立變化,具體應用場景如第三方支付對接不同銀行的算法。   要點:1)抽象策略角

Java設計模式23——行為模式之訪問者模式

font string 概念 str ron 直接 integer span das 一、概述   概念      作用於某個對象群中各個對象的操作。它可以使你在不改變這些對象本身的情況下,定義作用於這些對象的新操作。   引入   試想這樣一個場景,在一

C#設計模式8——外觀模式 java設計模式之外觀模式門面模式

1.外觀模式介紹   外觀模式也被叫做門面模式,這種模式的作用是:隱藏系統的複雜性,並向客戶端提供了一個可以訪問系統的統一介面,這個統一的介面組合了子系統的多個介面。使用統一的介面使得子系統更容易被訪問或者使用。 以去醫院看病為例,去醫院看病時可能要去掛號、門診、劃價、取藥等,讓患者或患者家屬覺得很複雜,如

設計模式介面卡

       模式角色: 1、源:已有的產品 2、目標:期望的產品 3、介面卡:把已有的產品轉化成期望的產品 一、類介面卡(繼承實現) //源 public class Painter { public void dra