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(){
...
}
}