適配器的幾種用法
一、要適配的功能來自兩個互不關聯的類
例如:
public class A { public void someFunctionOfA();}
public class B { public void someFunctionOfB();}
適配器的設計如下
public class C extends A {
private class B b ;
public C (B b) { this.b = b; }
public someFunctionOfAandB () {
super.someFunctionOfA();
b.someFunctionOfB();
}
}
我們知道因為Java中不允許多重繼承,所以這里類C首先繼承了類A,這樣它就具有了類A的功能了,特別是我們要注意到類C中包含了一個類B的成員變量,這樣類C也間接地具有了類B的功能(因為類C要實現的功能實際是委托其成員變量b來完成) 。
二、要適配的功能來自兩個互不關聯的接口,其目前沒有實現類
例如:
public interface A { public void someFunctionOfA(); }
public interface B { public void someFunctionOfB(); }
適配器的設計如下
public class C implements A, C {
public void someFunctionOfA(){....}
public void someFunctionOfB(){....}
}
這是最簡單也是最常用的方式,但只適合于目前沒有實現類的情況,如果我們的系統已經有了實現類,要再在新適配器里面重新實現,無異于重新發明車輪。
三、要適配的功能來自兩個互不關聯的接口,但已經有實現類
這種情況和情況一很像,但方式一強迫適配器必須繼承其中某一個類,那么以后適配器的子類將不能繼承其它的父類,但是因為有了接口,我們可以使用“two-way-adpater”的方式
例如:
public interface Ia { public void someFunctionOfA(); }
public interface Ib { public void someFunctionOfB(); }
public class A implements Ia { public void someFunctionOfA(){...} }
public class B implements Ib { public void someFunctionOfB(){...} }
public class C implements Ia, Ib {
private Ia ia ;
private Ib ib ;
public C(Ia ia) { this.ia = ia;}
public C(Ib ib) { this.ib = ib;}
public void someFunctionOfA(){
ia.someFunctionOfA();
}
public void someFunctionOfB(){
ib.someFunctionOfB();
}
}
我們可以看到這里適配器C沒有繼承那一個特定的類,相反它實現了所有的接口,但它重載了構造方法,我們可以根據需要來讓適配器適配想要的功能。
比如:現在我們想讓適配器適配接口Ia的功能,那么我們將調用適配器的public C(Ia ia),傳入一個Ia接口的實例,再調用someFunctionOfA();如果我們想要適配接口Ib的功能,那么只需要調用構造方法public C(Ib ib),再調用someFunctionOfB()。
這樣的好處就是適配器是動態的,我們可以控制適配器在某個適合適配某個想要的功能,而不會像方式一一樣不管三七二十一,把所有的功能都實現了。
四、要適配的功能來自一個類和一個接口
例如:
public class A { public void someFunctionOfA(){....}}
public interface B { public void someFunctionOfB(); }
適配器的設計如下
public class C extends A implements B {
public void someFunctionOfB(){...}
public void someFunctionOfAandB(){
super.someFunctionOfA();
someFunctionOfB();
}
}
從上面的四種方式來看,方式二最簡單也最常用,方式三最靈活,方式一和四有相同的地方就是都繼承了其中的某一個類,這樣就限制了適配器的子類不能再繼承其它的功能父類了,不同的地方是方式一使用委托的方式來完成類B的功能,而方式四則自己實現了接口的方法。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2008-01-14 17:50
Paul Lin 閱讀(1440)
評論(0) 編輯 收藏 所屬分類:
模式與重構