類擴充卡
客戶的開發人員定義了一個接口,期望用這個接口來完成整數的求和操作,接口定義如下:
public interface Operation{
public int add(int a,int b);
}
開發人員在了解這個接口的定義後,發現一個第三方類,裡面有一個方法能實作他們期望的功能,其代碼如下:
public class OtherOperation{
public int otherAdd(int a,int b){
return a + b;
}
以上第三方類OtherOperation的方法public int otherAdd(int a,int b)所提供的功能,完全能符合客戶的期望,是以隻需要想辦法把OtherOperation的otherAdd(int a,int b)和客戶的Operation接口聯系起來,讓這個第三方類來為客戶提供他們期望的服務就行了,這樣就避免了開發人員再度去研究類似OtherOperation的otherAdd(int a,int b)方法的實作(利用已有的輪子,避免重複發明),這方法之一,就是用擴充卡模式:
public class AdapterOperation extends OtherOperation implements Operation{
public int add(int a,int b){
return otherAdd(a,b);
以上就是擴充卡的實作方法之一,類擴充卡,在以上實作中存在着三中角色分别是:
1:适配目标角色:Operation。
2:适配類(原)角色:OtherOperation。
3:擴充卡角色:AdapterOperation。
其中擴充卡角色是擴充卡模式的核心。
擴充卡的主要工作就是通過封裝現有的功能,使他滿足需要的接口。
對象擴充卡
我們再來看看另一種情況:
假如客戶接口期望的功能不止一個,而是多個:
public int minus(int a,int b);
public int multiplied(int a,int b);
而能提供這些實作的原可能不止一個:
public class OtherAdd{
}
public class OtherMinus{
public int minus(int a,int b){
return a - b;
public class OtherMultiplied{
public int multiplied(int a,int b){
return a * b;
由于java是不能實作多繼承的,是以我們不能通過建構一個擴充卡,讓他來繼承所有原以完成我們的期望,這時候怎麼辦呢?隻能用擴充卡的另一種實作--對象擴充卡:
public class AdapterOperation implements Operation{
private OtherAdd add;
private OtherMinus minus;
private OtherMultiplied multiplied;
public void setAdd(OtherAdd add){
this.add = add;
public void setMinus(OtherMinus minus){
this.minus = minus;
public void setMultiplied(OtherMultiplied multiplied){
this.multiplied = multiplied;
//适配加法運算
return add.otherAdd(a,b);
//适配減法運算
return minus.minus(a,b);
//适配乘法運算
return multiplied.multiplied(a,b);
}
上面代碼很明顯,擴充卡并不是通過繼承來擷取适配類(原)的功能的,而是通過适配類的對象來擷取的,這就解決了java不能多繼承所帶來的不便了。這也是java提倡的程式設計思想之一,即盡量使用聚合不要使用繼承。 還有一種情況是需要使用對象擴充卡的。我們來看看,單我們的客戶提供的需求并不是一個明确的接口,而是一個類,并沒有定義期望的方法,如下
public class A{
public int add(int a,int b){
return a + b;
}
現在客戶要一個新類B,要求能在保留類A功能的情況下增加一個運算減法的功能,并要求B能随時替換掉A但不能對已有系統造成影響。這樣我們隻能建立一個類B,并讓B繼承A。
public class B extends A{
b(){
super();
}
public int minus(int a,int b){
//待實作的減法運算函數..
這時候,我們發現類C已經提供了實作減法的函數,
public class C{
public int minus(int a,int b){
return a - b;
}
為了避免重複去設計該函數,我們決定引入C類,通過适配C類來達到我們的期望,但問題是A和C都是一個具體類,我們無法讓B同時繼承這個兩個類,而B繼承A又是必須的,是以我們隻能考慮把C給内聚到B内部,對象擴充卡又得派上用場了。
public class B extends A{
private C c;
B(){
super();
public void setMinus(C c){
this.c= c;
return c.minus(a,b);
點我親╭(╯3╰)╮