zoukankan      html  css  js  c++  java
  • 步步为营 .NET 设计模式学习笔记 十八、Template(模板模式)

    概述

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

    意图

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

    结构图

    alt

    图1 Template Method 模式结构图

    生活中的例子

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

    alt

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

    示例用例图

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

    image

    代码设计

    先创建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