好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

步步为营 .NET 设计模式学习笔记 十八、Template(模板模式)

步步为营 .NET 设计模式学习笔记 十八、Template(模板模式)

概述

变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对。如何更好的去抓住变化点,应对变化?如何更好的提高代码复用?通过学习Template Method模式,您应该有一个新的认识。

意图

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。[-GOF《设计模式》]

结构图

图1 Template Method 模式结构图

生活中的例子

模板方法定义了一个操作中算法的骨架,而将一些步骤延迟到子类中。房屋建筑师在开发新项目时会使用模板方法。一个典型的规划包括一些建筑平面图,每个平面图体现了不同部分。在一个平面图中,地基、结构、上下水和走线对于每个房间都是一样的。只有在建筑的后期才开始有差别而产生了不同的房屋样式。

图2 使用建筑图为例子的Template Method模式

示例用例图

定义一个超市抽象类,每个超市继承这个抽象类.形成我们的模板模式,用例图如下:

代码设计

先创建ISuperMarket.cs:

01 public   interface   ISuperMarket

02 {

03      /// <summary>

04      /// 活动开始时间

05      /// </summary>

06      /// <returns></returns>

07      DateTime PreferencesStartTime();

08  

09      /// <summary>

10      /// 种类

11      /// </summary>

12      /// <returns></returns>

13      int   Category();

14  

15      /// <summary>

16      /// 优惠折扣

17      /// </summary>

18      /// <returns></returns>

19      double   Discount();

20  

21      /// <summary>

22      /// 超市名称

23      /// </summary>

24      /// <returns></returns>

25      string   Name();

26  

27      /// <summary>

28      /// 显示信息

29      /// </summary>

30      /// <returns></returns>

31      string   ShowInfo();

32  

33       

34 }

再创建SuperMarket.cs:

01 public   abstract   class   SuperMarket : ISuperMarket

02 {

03      #region ISuperMarket 成员

04  

05      public   abstract   DateTime PreferencesStartTime();

06  

07  

08      public   abstract   int   Category();

09  

10  

11      public   abstract   double   Discount();

12  

13  

14      public   abstract   string   Name();

15  

16  

17      public   string   ShowInfo()

18      {

19          StringBuilder strBuilder =  new   StringBuilder();

20          strBuilder.AppendFormat( "{0}在{1}有{2}种商品享受{3}折优惠.赶快抢购!\n" , Name(), PreferencesStartTime().ToShortDateString(), Category().ToString(), (Discount() * 10).ToString());

21          return   strBuilder.ToString();

22      }

23  

24      #endregion

25 }

再创建WalMart.cs:

01 public   class   WalMart : SuperMarket

02 {

03      public   override   DateTime PreferencesStartTime()

04      {

05          return   DateTime.Now.AddDays(7);

06      }

07  

08      public   override   int   Category()

09      {

10          return   100;

11      }

12  

13      public   override   double   Discount()

14      {

15          return   0.8;

16      }

17  

18      public   override   string   Name()

19      {

20          return   "沃尔玛" ;

21      }

22 }

再创建GoodAndMore.cs:

01 public   class   GoodAndMore : SuperMarket

02   {

03       public   override   DateTime PreferencesStartTime()

04       {

05           return   DateTime.Now.AddDays(7);

06       }

07  

08       public   override   int   Category()

09       {

10           return   150;

11       }

12  

13       public   override   double   Discount()

14       {

15           return   0.85;

16       }

17  

18       public   override   string   Name()

19       {

20           return   "好又多" ;

21       }

22   }

最后再调用

01 public   partial   class   Run : Form

02 {

03      public   Run()

04      {

05          InitializeComponent();

06      }

07  

08      private   void   btnRun_Click( object   sender, EventArgs e)

09      {

10          //-------------------------------------

11          ISuperMarket superMarket =  new   Template.WalMart();

12          rtbResult.AppendText(superMarket.ShowInfo());

13  

14          superMarket =  new   GoodAndMore();

15          rtbResult.AppendText(superMarket.ShowInfo());

16  

17      }

18  

19 }

结果如下图:

 

实现要点

1.Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。

2.除了可以灵活应对子步骤的变化外,“不用调用我,让我来调用你”的反向控制结构是Template Method的典型应用。

3.在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法,纯虚方法),但一般推荐将它们设置为protected方法。[李建忠]

4.复用算法的骨架,将可变的实现细节留给子类实现。

5.留给子类实现的方法需要在父类中定义,可以是抽象方法也可以是带有默认实现的方法。

适用性

1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是Opdyke和Johnson所描述过的“重分解以一般化”的一个很好的例子。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

3.控制子类扩展。模板方法只在特定点调用“Hook”操作,这样就只允许在这些点进行扩展。

4.如果某些类型的操作拥有共同的实现骨架和不同的实现细节的话,可以考虑使用模版方法来封装统一的部分。

总结

1.Template Method模式是非常简单的一种设计模式,但它却是代码复用的一项基本的技术,在类库中尤其重要。

2.模版方法可以说是最不像设计模式的设计模式,通常很多设计模式会和模版方法一起使用。

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于步步为营 .NET 设计模式学习笔记 十八、Template(模板模式)的详细内容...

  阅读:46次

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://www.haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网
[ SiteMap ]