GOF定义:

        Template Method(模版方法):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

一 : 我为什么用Template Method?

        最近在做的系统中,有很多档案需要管理:比如药品档案,供应商档案,销售商档案等等,对这些档案的管理主要是:

  • 新增档案信息
  • 修改档案信息
  • 删除档案信息
  • 根据查询条件查询满足条件的档案集合
  • 根据档案编号查询单个档案信息

        对于每个档案,操作的流程都是一样的,如果每个程序员都写一遍,难免会出现一些流程上的差异,而且会出现很多重复的代码,为了解决这个问题,在此使用了Template Method

二 : 代码实现举例:

1.定义一个抽象类,抽象类中定义了算法的骨架(假设一个修改操作要先检查第一次CheckOne,然后检查第二次CheckTwo,然后调用更新方法UpdateItem.如果检查不通过怎么办,如果更新成功怎么办,这些我们都在抽象类中写好,但是怎么检查,怎么保存更新我们不管,这是程序员真正要实现的方法):

   1:   public abstract class BaseHandle
   2:      {
   3:          public BaseHandle()
   4:          {
   5:   
   6:          }
   7:   
   8:          public void AlterItem()
   9:          {
  10:              try
  11:              {
  12:                  if (this.CheckOne() == false)
  13:                  {
  14:                      Console.WriteLine("第一次检查未通过.");
  15:                      return;
  16:                  }
  17:                  if (this.CheckTwo() == false)
  18:                  {
  19:                      Console.WriteLine("第一次检查未通过.");
  20:                      return;
  21:                  }
  22:                  if (this.UpdateItem())
  23:                  {
  24:                      Console.WriteLine("修改成功.");
  25:                      return;
  26:                  }
  27:                  else
  28:                  {
  29:                      Console.WriteLine("修改失败.");
  30:                  }
  31:              }
  32:              catch (Exception exc)
  33:              {
  34:                  Console.Write(exc.ToString());
  35:              }
  36:          }
  37:   
  38:          protected abstract bool CheckOne();
  39:   
  40:          protected abstract bool CheckTwo();
  41:   
  42:          protected abstract bool UpdateItem();
  43:      }

2.编写具体的子类(子类只需实现父类中定义的抽象方法,实现的方式完全由自己定义):

第一个子类:

   1:      public class OneHandle:BaseHandle
   2:      {
   3:          protected override bool CheckOne()
   4:          {
   5:              Console.WriteLine("OneHandle-------CheckOne()");
   6:              return true;
   7:          }
   8:   
   9:          protected override bool CheckTwo()
  10:          {
  11:              Console.WriteLine("OneHandle-------CheckTwo()");
  12:              return true;
  13:          }
  14:   
  15:          protected override bool UpdateItem()
  16:          {
  17:              Console.WriteLine("OneHandle-------UpdateItem()");
  18:              return true;
  19:          }
  20:      }

第二个子类:

   1:      public class TwoHandle : BaseHandle
   2:      {
   3:          protected override bool CheckOne()
   4:          {
   5:              Console.WriteLine("TwoHandle-------CheckOne()");
   6:              return true;
   7:          }
   8:   
   9:          protected override bool CheckTwo()
  10:          {
  11:              Console.WriteLine("TwoHandle-------CheckTwo()");
  12:              return true;
  13:          }
  14:   
  15:          protected override bool UpdateItem()
  16:          {
  17:              Console.WriteLine("TwoHandle-------UpdateItem()");
  18:              return true;
  19:          }
  20:      }

3.调用方法(这时调用两个子类的方法,执行的步骤是一模一样的了):

   1:      class Program
   2:      {
   3:          static void Main(string[] args)
   4:          {
   5:              OneHandle oneHandle = new OneHandle();
   6:              oneHandle.AlterItem();
   7:   
   8:              TwoHandle twoHandle = new TwoHandle();
   9:              twoHandle.AlterItem();
  10:          }
  11:      }

4.执行结果:

捕获

 

总结:Template Method设计模式让我们能定义操作的步骤,极大的降低了我们几个人做类似功能时的代码量,并且规范了我们的操作步骤,非常实用.

作者: 风枫峰 发表于 2011-07-19 16:33 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"