結(jié)合項目實例 回顧傳統(tǒng)設(shè)計模式(七)適配器模式(附外觀模式)
2011-10-06 09:38 熬夜的蟲子 閱讀(732) 評論(0) 收藏 舉報記得以前章節(jié)談過的裝飾者模式,我們將對象包裝起來,賦予他們新的職責(zé)。而現(xiàn)在則是以不同目的,包裝某些對象:讓他們的接口看起來不像自己而像是別的東西。這樣就可以在設(shè)計中,將類的接口轉(zhuǎn)換成想要的接口,以便實現(xiàn)不同的接口。
在項目中,適配器模式一般扮演者協(xié)調(diào)者的作用。
1.客戶通過目標(biāo)接口調(diào)用適配器的方法對適配器發(fā)出請求
2.適配器使用被適配者接口把請求轉(zhuǎn)換成被適配者的一個或多個調(diào)用接口
3.客戶接受到調(diào)用的結(jié)果,但并未察覺這一切是適配器在起轉(zhuǎn)換作用
另外還有一種特殊情況,萬一系統(tǒng)新舊并存,舊的部分期望舊的廠商接口,但我們卻已經(jīng)使用新廠商的接口編寫了這一部分,這個時候該怎么辦?這里使用適配器,那里卻使用未包裝的接口,這實在讓人感到混亂。這種情況需要創(chuàng)建一個雙向的適配器,支持兩邊的接口。
關(guān)于這一節(jié)的項目 咱們就選銀行支付驅(qū)動
/// 支付驅(qū)動
/// </summary>
public interface PayChannelDriver
{
void PayCallBack();
string ReplaceHtmlCode(string order_no, string order_create_time,string currency, string extra, string goods_desc);
}
/// <summary>
/// 銀行支付驅(qū)動
/// </summary>
public class CMBPayChannelDriver : PayChannelDriver
{
public void PayCallBack()
{
Console.WriteLine("this is CMBPayChannelDriver");
}
public string ReplaceHtmlCode(string order_no, string order_create_time, string currency, string extra, string goods_desc)
{
return "";
}
}
/// <summary>
/// 第三方支付驅(qū)動
/// </summary>
public class OtherPayChannelDriver
{
public void OtherPayCallBack()
{
Console.WriteLine("this is OtherPayChannelDriver");
}
public string GetReuqestUrl(string order_no, string order_create_time, string goods_desc)
{
return "";
}
}
/// <summary>
/// 適配器
/// </summary>
public class PayChannelDriverAdapter : PayChannelDriver
{
OtherPayChannelDriver ocd;
public PayChannelDriverAdapter(OtherPayChannelDriver otherpcd)
{
this.ocd = otherpcd;
}
public void PayCallBack()
{
ocd.OtherPayCallBack();
}
public string ReplaceHtmlCode(string order_no, string order_create_time,string currency, string extra, string goods_desc)
{
return ocd.GetReuqestUrl(order_no, order_create_time,goods_desc);
}
}
測試看看
PayChannelDriver pd = new CMBPayChannelDriver();
//第三方支付不支持銀行驅(qū)動
OtherPayChannelDriver od = new OtherPayChannelDriver();
//適配器
PayChannelDriver apd = new PayChannelDriverAdapter(od);
//驅(qū)動支持適配器
pd.PayCallBack();
apd.PayCallBack();

總結(jié):適配器模式將一個類的接口轉(zhuǎn)換成客戶期望的另一個接口。適配器讓原本接口不兼容的類可以合作無間。
設(shè)計原則: 當(dāng)你正在設(shè)計一個系統(tǒng),不管是任何對象,你都要注意它所交互的類有哪些,并注意它和這些類是如何交互的。不要讓太多的類耦合在一起,免得修改系統(tǒng)中一部分,會影響到其他部分。如果許多類之間相互依賴,那么這個系統(tǒng)就會變成一個易碎的系統(tǒng),它需要花許多成本維護,也會因為太復(fù)雜而不容易被其他人了解。
下面我們再看看外觀模式
在適配器模式中一個適配器只能夠封裝一個類嗎?適配器模式的工作是將一個借口轉(zhuǎn)換成另一個。雖然大多數(shù)的適配器模式所采取的例子都是讓一個適配器包裝一個被適配者,但我們都知道這個世界其實復(fù)雜多了,需要讓一個適配器包裝多個被適配者。這就涉及到外觀模式。
外觀模式提供一個統(tǒng)一的接口,用來訪問子系統(tǒng)中的一群接口。外觀定義了一個高層接口,讓子系統(tǒng)更容易使用。實例的話就不再贅述了。
總得來說 外觀模式基于適配器模式讓接口變得更簡單。
![]() |
原創(chuàng)作品允許轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章原始出處以及作者信息。 作者:熬夜的蟲子 點擊查看:博文索引 |

浙公網(wǎng)安備 33010602011771號