当前位置: 网学 > 编程文档 > 其他类别 > 正文

设计模式系列之代理模式

来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 13/01/12
样两个类就紧密的耦合在一起了,若Counter类改变,那么MrLi类也不得不改变,这时我们如果想使用新的柜台类(NewCounter),也需要修改调用者本身。

所以我们需要使用接口分离实现。代码如下:

  1. /// <summary> /// 柜台类也就是具体类提供的功能规则  
  2. /// </summary>  
  3. public interface ICounter  
  4. {  
  5. void ActivationCard(Card card);  
  6. }  
  7.  /// <summary> /// 热心肠的老李  
  8. /// </summary>  
  9. public class MrLi : ICounter  
  10. {  
  11. //激活工卡方法  
  12. public void ActivationCard(Card card)  
  13. {  
  14. Counter.Instance.ActivationCard(card);  
  15. }  
  16. }  
  17. /// <summary> /// 柜台类  
  18. /// </summary>  
  19. public sealed class Counter : ICounter  
  20. {  
  21. //在第一次调用类成员时,初始化唯一实例  
  22. private static readonly Counter instance = new Counter();  
  23. private Counter()  
  24. {  
  25. }  
  26. //返回类型实例属性  
  27. public static Counter Instance  
  28. {  
  29. get 
  30. {  
  31. return instance;  
  32. }  
  33. }  
  34. //激活工卡方法  
  35. public void ActivationCard(Card card)  
  36. {  
  37. //激活工卡的过程  
  38. Console.WriteLine("{0}的工卡激活成功!",card.CardName);  
  39. }  
  40. }  
  41. /// <summary> /// 新的柜台类  
  42. /// </summary>  
  43. public sealed class NewCounter : ICounter  
  44. {  
  45. //在第一次调用类成员时,初始化唯一实例  
  46. private static readonly NewCounter instance = new NewCounter();  
  47. private NewCounter()  
  48. {  
  49. }  
  50. //返回类型实例属性  
  51. public static NewCounter Instance  
  52. {  
  53. get 
  54. {  
  55. return instance;  
  56. }  
  57. }  
  58. //激活工卡方法  
  59. public void ActivationCard(Card card)  
  60. {  
  61. //激活工卡的过程  
  62. Console.WriteLine("{0}的工卡激活成功!", card.CardName);  
  63. }  

有了接口的约束,所有柜台类都遵循了这个约束将激活卡片的方法统一成(ActivationCard),那么在将来切换对象的时候都可以以一种统一的调用方式去无缝的却换。

这时细心的朋友还会说,Mr.Li的ActivationCard方法中调用的是具体的counter类型如果换成Newcounter,还是要去修改它的代码,你现在只能是不用去修改调用方法了而已,想的好,还记得我们当时的工厂模式吗?它的好处不就是降低耦合吗?为什么不用?

那么加入工厂类(CounterProvider),在修改一下MrLi的调用使它的调用依赖于抽象接口而不是具体的实现,代码如下:

  1. /// <summary> /// 热心肠的老李  
  2. /// </summary>  
  3. public class MrLi : ICounter  
  4. {  
  5. //激活工卡方法  
  6. public void ActivationCard(Card card)  
  7. {  
  8.  ICounter counter = CounterProvider.GetCounter();  
  9. counter.ActivationCard(card);  
  10.  }  
  11. }  
  12. /// <summary> /// 柜台类工厂  
  13. /// </summary>  
  14.  public class CounterProvider  
  15. {  
  16.  public static ICounter GetCounter()  
  17.  {  
  18. ICounter counter = null 
  19. //从配置文件确定实例化那个柜台类  
  20. if (ReadConfig)  
  21. {  
  22. counter = Counter.Instance;  
  23. }  
  24. else 
  25. {  
  26. counter = NewCounter.Instance;  
  27. }  
  28. }  

  • 下一篇资讯: 企业应用架构模式
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号