適配器的幾種用法
一、要適配的功能來(lái)自兩個(gè)互不關(guān)聯(lián)的類
例如:
public class A { public void someFunctionOfA();}
public class B { public void someFunctionOfB();}
適配器的設(shè)計(jì)如下
public class C extends A {
private class B b ;
public C (B b) { this.b = b; }
public someFunctionOfAandB () {
super.someFunctionOfA();
b.someFunctionOfB();
}
}
我們知道因?yàn)镴ava中不允許多重繼承,所以這里類C首先繼承了類A,這樣它就具有了類A的功能了,特別是我們要注意到類C中包含了一個(gè)類B的成員變量,這樣類C也間接地具有了類B的功能(因?yàn)轭怌要實(shí)現(xiàn)的功能實(shí)際是委托其成員變量b來(lái)完成) 。
二、要適配的功能來(lái)自兩個(gè)互不關(guān)聯(lián)的接口,其目前沒(méi)有實(shí)現(xiàn)類
例如:
public interface A { public void someFunctionOfA(); }
public interface B { public void someFunctionOfB(); }
適配器的設(shè)計(jì)如下
public class C implements A, C {
public void someFunctionOfA(){....}
public void someFunctionOfB(){....}
}
這是最簡(jiǎn)單也是最常用的方式,但只適合于目前沒(méi)有實(shí)現(xiàn)類的情況,如果我們的系統(tǒng)已經(jīng)有了實(shí)現(xiàn)類,要再在新適配器里面重新實(shí)現(xiàn),無(wú)異于重新發(fā)明車(chē)輪。
三、要適配的功能來(lái)自兩個(gè)互不關(guān)聯(lián)的接口,但已經(jīng)有實(shí)現(xiàn)類
這種情況和情況一很像,但方式一強(qiáng)迫適配器必須繼承其中某一個(gè)類,那么以后適配器的子類將不能繼承其它的父類,但是因?yàn)橛辛私涌冢覀兛梢允褂?#8220;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沒(méi)有繼承那一個(gè)特定的類,相反它實(shí)現(xiàn)了所有的接口,但它重載了構(gòu)造方法,我們可以根據(jù)需要來(lái)讓適配器適配想要的功能。
比如:現(xiàn)在我們想讓適配器適配接口Ia的功能,那么我們將調(diào)用適配器的public C(Ia ia),傳入一個(gè)Ia接口的實(shí)例,再調(diào)用someFunctionOfA();如果我們想要適配接口Ib的功能,那么只需要調(diào)用構(gòu)造方法public C(Ib ib),再調(diào)用someFunctionOfB()。
這樣的好處就是適配器是動(dòng)態(tài)的,我們可以控制適配器在某個(gè)適合適配某個(gè)想要的功能,而不會(huì)像方式一一樣不管三七二十一,把所有的功能都實(shí)現(xiàn)了。
四、要適配的功能來(lái)自一個(gè)類和一個(gè)接口
例如:
public class A { public void someFunctionOfA(){....}}
public interface B { public void someFunctionOfB(); }
適配器的設(shè)計(jì)如下
public class C extends A implements B {
public void someFunctionOfB(){...}
public void someFunctionOfAandB(){
super.someFunctionOfA();
someFunctionOfB();
}
}
從上面的四種方式來(lái)看,方式二最簡(jiǎn)單也最常用,方式三最靈活,方式一和四有相同的地方就是都繼承了其中的某一個(gè)類,這樣就限制了適配器的子類不能再繼承其它的功能父類了,不同的地方是方式一使用委托的方式來(lái)完成類B的功能,而方式四則自己實(shí)現(xiàn)了接口的方法。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2008-01-14 17:50
Paul Lin 閱讀(1446)
評(píng)論(0) 編輯 收藏 所屬分類:
模式與重構(gòu)