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

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

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

public class Male extends User implement Observer{
}

只需要繼承目標類,實現Observer介面,就實現了我們上述的目的,這種介面卡叫做類介面卡。

2、jdk中的被觀察者Observable是一個類,與上面的需求類似,我們的Male類,需要有Observable被觀察者的功能,又要具有User類的功能,那這怎麼辦?這裡最好不要讓User去繼承Observable類,這將破環原有的繼承體系。由於Java繼承只允許繼承一個類,我們使用類介面卡將無法滿足我們的需求,那麼,就要使用物件介面卡了。

class Male extends User{
    private Observable observable;

    //get set方法
}

這就是物件介面卡,採用組合的模式,這樣,User和Observable兩個類的功能我們都可以使用了。當然,這裡不是最好的方式,因為實際需求中不僅僅只有一個Male類,可能還有其他類需要有類似的需求,我們重複這樣定義實在是太麻煩了,所以,我們定義一個公共的類,作為一個介面卡,Male類直接繼承這個公共的介面卡就能夠滿足需求了。

class BaseUserObservable extends User{
    private Observable observable;

    //get set方法
} class Male extends BaseUserObservable { }

這樣就是物件介面卡了。

根據目的的不同,還可以分為 定製介面卡和預設介面卡。上面所說的,是目的性很強的,需要實現什麼什麼功能,就是定製介面卡,而預設介面卡,作用是在我們實現某些介面時,省去一些不需要的方法,比如:

interface A{

    public void method1();
    public void method2();
    public void method2();

}

有一個介面A,有三個方法,假設,我們有個類C,需要繼承A,則必須重寫這三個方法,這時候,假設我們值真正使用到的只有method1,那麼另外兩個方法的程式碼就顯得冗餘了,這時候可以使用預設介面卡。

class B implement A{

    public void method1(){}
    public void method2(){}
    public void method2(){}

}

那麼,我們的類C,只需要繼承B,然後重寫我們需要的方法即可

class C extends B {
    public void method1(){
        ...
    }
}