1. 程式人生 > >設計模式1:介面卡模式

設計模式1:介面卡模式

啥叫介面卡

舉個栗子,我的是安卓手機,室友的是蘋果手機,我的安卓機子只能用我的安卓資料線來充電,而不能使用室友的蘋果資料線,但是我想借助某種工具(不知道有沒有這種東東...),讓我的安卓手機可以用室友的蘋果資料線來充電,可以幫我們達到這個目的的工具就是介面卡。通俗來說,介面卡就是把原來不匹配的東西變成匹配的東西的一箇中間件。

而介面卡模式,就是借用介面卡思想的一種開發模式

可以分為三類

類介面卡

物件介面卡

介面介面卡

類介面卡

通過繼承來實現介面卡功能。

現在有兩個資料線(兩個介面)

interface android{
	
	void chargeAndroid();
}

interface iphone{
	
	void chargeIphone();
}

我的安卓手機是隻能用安卓資料線(實現介面)

class Android implements android{

	@Override
	public void chargeAndroid() {
		// TODO Auto-generated method stub
		
	}
}

現在我想找個介面卡,讓我的手機也能使用蘋果資料線。這個時候我們只需要在繼承Android的基礎上實現 iphone介面就行了

class Adapter extends Android implements iphone{

	@Override
	public void chargeIphone() {
		
	}
	
}

這時候我們的介面卡就完成了,既可以使用安卓手機充電(chargeAndroid方法),也可以使用蘋果手機充電(chargeIphone方法)啦!

物件介面卡

組合的思想來實現介面卡

同樣有兩根資料線(兩個介面)

interface android{
	
	void chargeAndroid();
}

interface iphone{
	
	void chargeIphone();
}

安卓充安卓(介面實現類)

class Android implements android{

	@Override
	public void chargeAndroid() {
		// TODO Auto-generated method stub
		
	}
}

接下來就是區別於類介面卡的地方了,在類介面卡中,我們主要利用了繼承的方式來實現介面卡。現在我們不妨換種思路,因為我們已經有了一個安卓的實現類,這個類有個chargeAndroid方法,因此在我們的介面卡中可以增加一個Android的物件屬性,然後在建構函式中給該屬性初始化,這樣我們就可以通過這個物件來呼叫chargeAndroid方法啦

class Adapter implements iphone{
	
	private Android android;
	
	public Adapter(Android android) {
		this.android = android;
	}

	@Override
	public void chargeIphone() {
		// TODO Auto-generated method stub
		
	}
	
}

介面介面卡

通過抽象類來實現介面卡, 和起前面提到的兩種有些區別。

設想一個場景,現在有一種超級充電器介面,它有許多方法,可以給安卓,蘋果,電腦,mp3,ipad等等一系列產品充電,但是我只需要它能充安卓和iphone就行了,其他的方法我用不到。如果我們直接實現該介面的的話,那麼我們就要實現它的所有方法,即便我把用不到的方法直接寫個括號,也會讓我們的程式比較臃腫,而且呼叫起來也不方便。因此我們可以用一個抽象類來實現這個介面,在抽象類中把所有方法置空,然後在用一個子類來繼承該類,然後重寫我們需要使用的那幾個方法即可,這個抽象類就是我們的介面卡。

超級充電器介面

interface wire{
	
	void chargeAndroid();
	void chargeIphone();
	void chargeComputer();
	void chargeMp3();
	
}

介面卡(抽象類)

abstract class Adapter implements wire{
	
	public void chargeAndroid(){}
	public void chargeIphone(){}
	public void chargeComputer(){}
	public void chargeMp3(){}
	
}

實現類

class Charge extends Adapter{
	public void chargeAndroid(){
		System.out.println("charge android。。");
	}
	public void chargeIphone(){
		System.out.println("charge iphone。。");
	}
	
}

介面卡模式應用場景

類介面卡與物件介面卡的使用場景一致,僅僅是實現手段稍有區別,二者主要用於如下場景:

  (1)想要使用一個已經存在的類,但是它卻不符合現有的介面規範,導致無法直接去訪問,這時建立一個介面卡就能間接去訪問這個類中的方法。

  (2)我們有一個類,想將其設計為可重用的類(可被多處訪問),我們可以建立介面卡來將這個類來適配其他沒有提供合適介面的類。

  以上兩個場景其實就是從兩個角度來描述一類問題,那就是要訪問的方法不在合適的接口裡,一個從接口出發(被訪問),一個從訪問出發(主動訪問)。

介面介面卡使用場景:

  (1)想要使用介面中的某個或某些方法,但是介面中有太多方法,我們要使用時必須實現介面並實現其中的所有方法,可以使用抽象類來實現介面,並不對方法進行實現(僅置空),然後我們再繼承這個抽象類來通過重寫想用的方法的方式來實現。這個抽象類就是介面卡。