今天下班,同事們無聊中又聊到了食堂(怎么寫食堂?吃貨?。。k公區(qū)離食堂遠(yuǎn)的同事老阮在大家你一句我一句的誘惑下,終于忍不住了決定不管在遠(yuǎn)也要找時(shí)間去嘗嘗,但是因?yàn)樯习嗖豁樎芬膊皇呛芊奖悖臀形覀兯奚岬睦侠钔編兔Φ诙煜热ラ_卡充值,熱心腸的老李當(dāng)然不會(huì)拒絕嘍。
成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括渭城網(wǎng)站建設(shè)、渭城網(wǎng)站制作、渭城網(wǎng)頁(yè)制作以及渭城網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,渭城網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到渭城省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
1、模擬場(chǎng)景
有了這個(gè)前奏今天的主題就當(dāng)然又有了,那么首先我們用代碼來實(shí)現(xiàn)上面的功能,首先來分析一下上面的場(chǎng)景:
①我們需要對(duì)卡片充值,所以需要一個(gè)卡片類,代碼如下:
- /// <summary>
- /// 卡片類
- /// </summary>
- public class Card
- {
- //卡片名稱
- private string cardName = string.Empty;
- public string CardName
- {
- get
- {
- return cardName;
- }
- set
- {
- cardName = value;
- }
- }
- //構(gòu)造方法
- public Card() { }
- public Card(string cName)
- {
- cardName = cName;
- }
- }
- /// <summary>
- /// 老阮
- /// </summary>
- public class MrRuan
- {
- //他有一個(gè)工卡
- private Card myCard = new Card("mrRuan");
- public Card MyCard
- {
- get
- {
- return myCard;
- }
- }
- }
- /// <summary>
- /// 柜臺(tái)類
- /// </summary>
- public sealed class Counter
- {
- //在第一次調(diào)用類成員時(shí),初始化唯一實(shí)例
- private static readonly Counter instance = new Counter();
- private Counter()
- {
- }
- //返回類型實(shí)例屬性
- public static Counter Instance
- {
- get
- {
- return instance;
- }
- }
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- //激活工卡的過程
- Console.WriteLine("{0}的工卡激活成功!",card.CardName);
- }
- }
- /// <summary>
- /// 熱心腸的老李
- /// </summary>
- public class MrLi
- {
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- Counter.Instance.ActivationCard(card);
- }
- }
- static void Main(string[] args)
- {
- //實(shí)例化老阮
- MrRuan ruan = new MrRuan();
- //實(shí)例化老李
- MrLi li = new MrLi();
- //將卡片給老李,老李負(fù)責(zé)去激活
- li.ActivationCard(ruan.MyCard);
- }
這時(shí)你要問了,那代理模式具體的定義是什么呀?到底什么是代理模式下?別著急繼續(xù)往下看吧。
2、代理模式
代理(Proxy)模式定義:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。
這時(shí)我們發(fā)現(xiàn)了多了一個(gè)接口ICounter,那么實(shí)現(xiàn)了接口的代理類與具體類的代碼如下:
- /// <summary>
- /// 柜臺(tái)類也就是具體類提供的功能規(guī)則
- /// </summary>
- public interface ICounter
- {
- void ActivationCard(Card card);
- }
- /// <summary>
- /// 熱心腸的老李
- /// </summary>
- public class MrLi : ICounter
- {
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- Counter.Instance.ActivationCard(card);
- }
- }
- /// <summary>
- /// 柜臺(tái)類
- /// </summary>
- public sealed class Counter : ICounter
- {
- //在第一次調(diào)用類成員時(shí),初始化唯一實(shí)例
- private static readonly Counter instance = new Counter();
- private Counter()
- {
- }
- //返回類型實(shí)例屬性
- public static Counter Instance
- {
- get
- {
- return instance;
- }
- }
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- //激活工卡的過程
- Console.WriteLine("{0}的工卡激活成功!",card.CardName);
- }
- }
在面向?qū)ο笤O(shè)計(jì)中,對(duì)象之間需要進(jìn)行交互和通信。例如:上面的代理類MrLi調(diào)用了具體類柜臺(tái)類counter的激活卡片的方法(ActiviationCard),那么這個(gè)時(shí)候代理類MrLi不在代理counter柜臺(tái)的激活卡片功能了,而是去另一個(gè)counterNew的柜臺(tái)去激活,但是counterNew柜臺(tái)激活卡片的方法是(CounterActiviationCard),怎么辦?我們需要去修改調(diào)用counter的類,那么如何降低耦合性呢?當(dāng)然就是將接口和實(shí)現(xiàn)分離開來,這樣代理間和柜臺(tái)對(duì)象之間的依賴就是基于接口,而不是實(shí)現(xiàn)!
例如:目前MrLi與counter之間的調(diào)用如下:
- /// <summary>
- /// 熱心腸的老李
- /// </summary>
- public class MrLi
- {
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- Counter.Instance.ActivationCard(card);
- }
- }
- /// <summary>
- /// 新的柜臺(tái)類
- /// </summary>
- public sealed class NewCounter
- {
- //在第一次調(diào)用類成員時(shí),初始化唯一實(shí)例
- private static readonly NewCounter instance = new NewCounter();
- private NewCounter()
- {
- }
- //返回類型實(shí)例屬性
- public static NewCounter Instance
- {
- get
- {
- return instance;
- }
- }
- //激活工卡方法
- public void CounterActivationCard(Card card)
- {
- //激活工卡的過程
- Console.WriteLine("{0}的工卡激活成功!", card.CardName);
- }
- }
所以我們需要使用接口分離實(shí)現(xiàn)。代碼如下:
- /// <summary>
- /// 柜臺(tái)類也就是具體類提供的功能規(guī)則
- /// </summary>
- public interface ICounter
- {
- void ActivationCard(Card card);
- }
- /// <summary>
- /// 熱心腸的老李
- /// </summary>
- public class MrLi : ICounter
- {
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- Counter.Instance.ActivationCard(card);
- }
- }
- /// <summary>
- /// 柜臺(tái)類
- /// </summary>
- public sealed class Counter : ICounter
- {
- //在第一次調(diào)用類成員時(shí),初始化唯一實(shí)例
- private static readonly Counter instance = new Counter();
- private Counter()
- {
- }
- //返回類型實(shí)例屬性
- public static Counter Instance
- {
- get
- {
- return instance;
- }
- }
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- //激活工卡的過程
- Console.WriteLine("{0}的工卡激活成功!",card.CardName);
- }
- }
- /// <summary>
- /// 新的柜臺(tái)類
- /// </summary>
- public sealed class NewCounter : ICounter
- {
- //在第一次調(diào)用類成員時(shí),初始化唯一實(shí)例
- private static readonly NewCounter instance = new NewCounter();
- private NewCounter()
- {
- }
- //返回類型實(shí)例屬性
- public static NewCounter Instance
- {
- get
- {
- return instance;
- }
- }
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- //激活工卡的過程
- Console.WriteLine("{0}的工卡激活成功!", card.CardName);
- }
- }
這時(shí)細(xì)心的朋友還會(huì)說,Mr.Li的ActivationCard方法中調(diào)用的是具體的counter類型如果換成Newcounter,還是要去修改它的代碼,你現(xiàn)在只能是不用去修改調(diào)用方法了而已,想的好,還記得我們當(dāng)時(shí)的工廠模式嗎?它的好處不就是降低耦合嗎?為什么不用?
那么加入工廠類(CounterProvider),在修改一下MrLi的調(diào)用使它的調(diào)用依賴于抽象接口而不是具體的實(shí)現(xiàn),代碼如下:
- /// <summary>
- /// 熱心腸的老李
- /// </summary>
- public class MrLi : ICounter
- {
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- ICounter counter = CounterProvider.GetCounter();
- counter.ActivationCard(card);
- }
- }
- /// <summary>
- /// 柜臺(tái)類工廠
- /// </summary>
- public class CounterProvider
- {
- public static ICounter GetCounter()
- {
- ICounter counter = null;
- //從配置文件確定實(shí)例化那個(gè)柜臺(tái)類
- if (ReadConfig)
- {
- counter = Counter.Instance;
- }
- else
- {
- counter = NewCounter.Instance;
- }
- }
- }
3、應(yīng)用場(chǎng)景
那么代理模式的幾種使用場(chǎng)景我們來看一看:
① 遠(yuǎn)程代理:為一個(gè)對(duì)象在不同地址空間提供局部代表。這樣可以隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí),例如:老阮(MrRuan)在地點(diǎn)A,老李在地點(diǎn)B,餐廳柜臺(tái)也在地點(diǎn)B,那么老李和老軟住在一起(都在地點(diǎn)A?。?,那么老李就是餐廳(地點(diǎn)B)在老軟與老李住處(地點(diǎn)A)的代表。
② 虛擬代理:是根據(jù)需要?jiǎng)?chuàng)建開銷很大的對(duì)象。通過它來存放實(shí)例化需要很長(zhǎng)時(shí)間的真是對(duì)象,例如:老阮(MrRuan)在地點(diǎn)A,到餐廳柜臺(tái)(地點(diǎn)B),因?yàn)榫嚯x遠(yuǎn)卻是很費(fèi)勁,而老李剛好在這里(地點(diǎn)B)上班,所以讓老李去辦是很可行的辦法。(不太恰當(dāng))
③ 安全代理:用來控制真是對(duì)象訪問時(shí)的權(quán)限,例如:老阮跟餐廳的柜臺(tái)MM剛分手不方便去辦理,所以需要借助老李去完成事項(xiàng)的辦理。
④ 智能代理:是指當(dāng)調(diào)用真是的對(duì)象時(shí),代理去處理另外一些事情,例如:老李幫助老阮辦理卡片激活時(shí),順便說說老阮的好話,讓她倆能夠和好。
文章名稱:設(shè)計(jì)模式系列-代理模式
標(biāo)題路徑:http://m.rwnh.cn/article24/ipjeje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、用戶體驗(yàn)、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站改版、網(wǎng)站營(yíng)銷、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)