代理模式簡而言之就是A擁有的功能B也有。
何時使用
想要訪問一個類別時做一些控制。
舉例說明:
1. 某個化妝品製造商大量生產化妝品並且販售,但消費者並不會直接跟工廠買貨品而是去百貨公司專櫃買。
則百貨公司專櫃 即為 代理
2. 想要買最新出版的IPHONE但目前台灣尚未販賣,則需要找代購商購買
代購商 即為 代理
實例:
音樂鈴工廠生產音樂鈴 (musicBoxProduce) 並且販賣,並在華山 設點 (proxyStore) 販售給消費者。
則販售音樂鈴為一個介面,生產工廠以及華山繼承介面上的動作並且實作。
代碼
IsellMusicBox.cs
namespace LearnPattern.ProxyPattern
{
interface IsellMusicBox
{
void sellMusicBox();
}
}
musicBoxProduce.cs
namespace LearnPattern.ProxyPattern
{
class musicBoxProduce : IsellMusicBox
{
string CustName;
public musicBoxProduce(string custName)
{
CustName = custName;
}
public void sellMusicBox()
{
Console.Write("sell box to " + CustName);
}
}
}
proxyStore.cs
namespace LearnPattern.ProxyPattern
{
class proxyStore : IsellMusicBox
{
musicBoxProduce m;
public proxyStore(string custName)
{
m = new musicBoxProduce(custName);
}
public void sellMusicBox()
{
m.sellMusicBox();
}
}
}
proxyMain.cs
namespace LearnPattern.ProxyPattern
{
class proxyMain
{
static void Main(string[] arg)
{
proxyStore p = new proxyStore("77");
p.sellMusicBox();
Console.ReadLine();
}
}
}
output
當初我以為代理主要是將繁忙的運算代理出來,但其實是顛倒的。
主要是將功能 是為了保護實際物件 讓只有真正需要實作 主要物件時 才使用
已減少系統開銷
參考資料
http://www.runoob.com/design-pattern/proxy-pattern.html