724
技術社區[雲棲]
Design Pattern: Adapter 模式 - Class Adapter
學習是分享和合作式的!
轉載請注明出處:https://blog.csdn.net/wdzxl198/article/details/9344951;
文章摘自: https://www.riabook.cn/doc/designpattern/;
Adapter模式的另一種作法是Class Adapter模式,在這個模式下,Adapter直接繼承Adaptee(要引進的新類別),以擁有當中的成員及方法,在C++中的話可以這麼作:
C++中可以多重繼承,但在Java中不行,所以在Java中若要采用Class Adapter,必須作點修改,一方麵繼承Adaptee,一方麵實作Target的介麵:
代碼的實現是這樣的:
public class Adapter extends Adaptee implements Target {
// ....
}
當然,這必須您原先的Target定義了共同的介麵,所以Class Adapter在Java中適用的場合較少,事實上,也比較建議使用Object Adapter,這樣的Adapter模式比較有彈性,例如,您可以在Adapter上加上個setter,以隨時可以抽換Adaptee。
在Java中,Class Adapter的一個應用場合是達到多重繼承的效果,您一定在很多時候聽別人說,介麵(interface)可以達到多重繼承的效果,這是怎麼回事?
其實要討論這個問題,首先您對於C++中多重繼承要先有認識,新手看了書說介麵可以達到多重繼承,切莫人雲亦雲,尤其是沒有學過C++的新手們,如果您對 於C++多重繼承想要有所認識,請先看看多 重繼承(一)與多
重繼承(二)。
Java不能多重繼承,但為何說Java中可以使用介麵(interface)來達到多重繼承的效果,首先效果之一,就如
多 重繼承(二) 中描述的“ 多重繼承時通常其中一個基底類別作為private實作體,而其它的用以表現完全的抽象介麵。”,在Java中這個效果可以使用介麵來達到,介麵此時所扮 演的即多 重繼承(二) 中的抽象類別,一個完全的抽象介麵,這個效果的達成方式,如
介 麵(interface)型態 中所介紹的,您可以直接對應這兩個主題中的程式實作來了解,了解Java中如何使用介麵(interface)來達到C++中所謂多重繼承的“一種”效 果。
來看看另一個情況。
如果有SomeClass類別與OtherClass類別,您想要SomeAndOther類別可以同時擁有SomeClass類別與 OtherClass類別中已定義好的操作,並可以進行多型操作,在C++中可以用多重繼承來達到,但在Java中顯然的無法使用多重繼承,怎麼辦?您可 以在設計上先繞個彎,先使用兩個介麵分別定義好SomeClass與OtherClass兩個類別的公開方法,例如:
public interface ISome {
public void doSome();
}
public interface IOther {
public void doOther();
}
接著讓SomeClass與OtherClass分別實作兩個介麵:
public class SomeClass implements ISome {
public void doSome() {
....
}
}
public class OtherClass implements IOther {
public void doOther() {
....
}
}
SomeAndOther如何同時擁有兩個SomeClass與OtherClass類別已定義好的操作?並可以多型操作?SomeAndOther可以 繼承其中之一,並擁有其中之一,例如:
public class SomeAndOther extends SomeClass implements IOther {
private IOther other = new OtherClass();
public void doOther() {
other.doOther();
}
}
雖不滿意,但至少解決了目前的問題,當然這邊隻是其中一例,畢竟C++是C++,Java是Java,兩者語法並不是一對一的關係,視實際需求還可以變化 一下。
Eedit by Atlas,
Time:2013/7/16,17:07
最後更新:2017-04-03 16:48:36