Adapter模式
Adapter模式
引言
生活中有很多Adapter的例子。比方說,你買了一款舒適、手感極佳的鍵盤,它是P/S接口的,然而你的新式電腦已經(jīng)淘汰了P/S接口,只提供USB接口。此時,為了能夠使用這款鍵盤,就需要一個轉(zhuǎn)接頭,它的一頭是P/S接口的,用來連接鍵盤;另一頭是USB的,用來連接電腦。類似這樣的轉(zhuǎn)接頭就充當(dāng)一個Adapter的作用。類似的例子還有電源的三相/兩相 轉(zhuǎn)接頭等等。
?Adapter模式應(yīng)該是設(shè)計(jì)模式中一個輕量級的模式,實(shí)現(xiàn)起來也比較簡單,有時候不經(jīng)意中,你可能就已經(jīng)實(shí)現(xiàn)了一個Adapter模式,只是自己沒有發(fā)現(xiàn)而已。本文將通過一個范例介紹 Adapter模式。
Shape范例
很多編程的書籍中都喜歡使用一個Shape作為范例講述面向?qū)ο笾械睦^承,盡管這里我們講述的是Adapter模式,但是并不妨礙我們也使用這個Shape的例子。考慮下面一幅關(guān)系圖:
在這幅圖中,Shape抽象類定義了Draw()方法,用于在屏幕上繪制圖形,Square和Circle繼承了Shape類,并實(shí)現(xiàn)了Draw()方法。另一個與Shape相關(guān)聯(lián)的類Window,它的Initialize()方法接受一個Shape類型的參數(shù),并調(diào)用其Draw()方法(實(shí)際中還可能進(jìn)行其他操作,這里的關(guān)鍵是方法的簽名只接受一個Shape類型的參數(shù))。
public void Initialize(Shape s)
現(xiàn)在考慮這樣一種情況:假如我們從第三方獲得了另一個類XTriangle,而它并沒有Draw()方法,只有一個完成同樣功能的Display()方法。很顯然,這個類也不會繼承自Shape基類,我們也無法對其進(jìn)行修改。此時。如果我們想讓客戶程序Window類使用XTriangle類,就不得不再重載一個Initialize()方法,讓它接受一個XTriangle類型的參數(shù)。但這是治標(biāo)不治本的方法,因?yàn)榭赡苡泻芏囝愃芖indow的類,它們都只接受Shape類型,對每一處都進(jìn)行修改顯然是不切實(shí)際的。此時,通常的辦法是創(chuàng)建一個包裝(Wrapper)類,讓這個包裝類繼承自Shape,同時讓它含有一個對XTriangle的引用,并且將Draw()方法的實(shí)現(xiàn)委托給XTriangle.Display()去完成。我們將這個包裝類命名為Triangle,而這種模式或者解決類似問題的方法,就稱為Adapter模式。注意在很多情況下我們會將Triangle命名為TriangleAdapter,但這里命名為Triangle會更清晰一些,但它仍是一個Adapter。下面是類圖:
接下來我們看下來看一下Triangle的實(shí)現(xiàn):
public class Triangle : Shape {
??? private XTriangle triangle;
??? public Triangle(XTriangle triangle) {
??????? this.triangle = triangle;
??? }
??? public override void Draw() {
??????? triangle.Display();
??? }
}
OK,這樣就實(shí)現(xiàn)了Adapter模式,它的正式定義是:將一個類(XTriangle)的接口轉(zhuǎn)換為客戶端(Window)所期待的另一接口(Shape)。Adpater能夠讓各個類之間相互協(xié)作,而不受不兼容接口的影響。
總結(jié)
這篇文章通過一個簡短的范例演示了Adatper模式,通過創(chuàng)建一個包裝類,解決了在引入第三方類時接口不兼容的問題。感謝閱讀,希望這篇文章能給你帶來幫助。
總結(jié)
- 上一篇: 理解虚方法
- 下一篇: 手机拍照功能的简单实现