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