天天看點

擴充卡模式

類擴充卡

客戶的開發人員定義了一個接口,期望用這個接口來完成整數的求和操作,接口定義如下:

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╰)╮
上一篇: Linux HA
下一篇: Ciscoasa HA