2、代理模式
代理(Proxy)模式定义:为其他对象提供一种代理以控制对这个对象的访问。 类图如下:
498)this.width=498;'' onmousewheel = ''javascript:return big(this)'' alt="" src="/uploadfile/201301/12/4B12236725.jpg" />
这时我们发现了多了一个接口ICounter,那么实现了接口的代理类与具体类的代码如下:
- /// <summary> /// 柜台类也就是具体类提供的功能规则
- /// </summary>
- public interface ICounter
- {
- void ActivationCard(Card card);
- }
- /// <summary> /// 热心肠的老李
- /// </summary>
- public class MrLi : ICounter
- {
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- Counter.Instance.ActivationCard(card);
- }
- }
- /// <summary> /// 柜台类
- /// </summary>
- public sealed class Counter : ICounter
- {
- //在第一次调用类成员时,初始化唯一实例
- private static readonly Counter instance = new Counter();
- private Counter()
- {
- }
- //返回类型实例属性
- public static Counter Instance
- {
- get
- {
- return instance;
- }
- }
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- //激活工卡的过程
- Console.WriteLine("{0}的工卡激活成功!",card.CardName);
- }
- }
那么这个接口有什么用呢?
在面向对象设计中,对象之间需要进行交互和通信。例如:上面的代理类MrLi调用了具体类柜台类counter的激活卡片的方法(ActiviationCard),那么这个时候代理类MrLi不在代理counter柜台的激活卡片功能了,而是去另一个counterNew的柜台去激活,但是counterNew柜台激活卡片的方法是(CounterActiviationCard),怎么办?我们需要去修改调用counter的类,那么如何降低耦合性呢?当然就是将接口和实现分离开来,这样组件间和日志对象之间的依赖就是基于接口,而不是实现!
例如:目前MrLi与counter之间的调用如下:
- /// <summary> /// 热心肠的老李
- /// </summary>
- public class MrLi
- {
- //激活工卡方法
- public void ActivationCard(Card card)
- {
- Counter.Instance.ActivationCard(card);
- }
- }
- 那么如果需要加入新的柜台类(counterNew),它的激活方法叫(CounterActivationCard),代码如下:
- /// <summary> /// 新的柜台类
- /// </summary>
- public sealed class NewCounter
- {
- //在第一次调用类成员时,初始化唯一实例
- private static readonly NewCounter instance = new NewCounter();
- private NewCounter()
- {
- }
- //返回类型实例属性
- public static NewCounter Instance
- {
- get
- {
- return instance;
- }
- }
- //激活工卡方法
- public void CounterActivationCard(Card card)
- {
- //激活工卡的过程
- Console.WriteLine("{0}的工卡激活成功!", card.CardName);
- }
- }
这