模板方法模式

[ Template ]

[
抽象父类【抽象模板】 : 1 定义了一个或多个抽象操作 , 以便让子类实现 。这些抽象操作叫做基本操作 , 它们是一个顶级逻辑的组成部分。
2 定义并实现了一个模板方法 。这个模板方法一般是一个具体方法 , 它给出了一个顶级逻辑的骨架 ,
而逻辑的组成步骤在相应的抽象操作中 , 推迟到子类实现 。顶级逻辑也有可能调用一些具体方法 。


具体的子类【具体模板】 : 1 实现父类所定义的一个或多个抽象方法 , 它们是一个顶级逻辑的组成部分。
2 每一个抽象模板角色都可以有任意多个具体模板角色与之对应 , 而每一个具体模板角色都可以给出这些抽象方法
(也就是顶级逻辑的组成部分)的不同实现 , 从而使得顶级逻辑的实现各不相同。
]

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

定义模板父类 , 里面实现了不需要改变的方法(算法) , 定义一些在算法里用到的 "会改变" 的虚方法 , 子类继承该父类模板时 , 只需要重写父类中会改变的虚函数




源码 :

// <summary>
// 模板类 , 里面定义了不变的方法 , 和需要在子类中改动的 虚方法
// </summary>
public class TestPaper
{
  public void TestQuestion1()
  {
    Console.WriteLine("1+1={0}", Answer1());
  }

  public void TestQuestion2()
  {
    Console.WriteLine("1+2={0}", Answer2());
  }

  public void TestQuestion3()
  {
    Console.WriteLine("1+3={0}", Answer3());
  }

  public virtual int Answer1()
  {
    return 0;
  }

  public virtual int Answer2()
  {
    return 0;
  }

  public virtual int Answer3()
  {
    return 0;
  }
}




public class TestPaperA : TestPaper
{
  public override int Answer1()
  {
    return 2;
  }

  public override int Answer2()
  {
    return 3;
  }

  public override int Answer3()
  {
    return 4;
  }
}




public class TestPaperB : TestPaper
{
  public override int Answer1()
  {
    return 2;
  }

  public override int Answer2()
  {
    return 3;
  }

  public override int Answer3()
  {
    return 4;
  }
}




class Program
{
  static void Main(string[] args)
  {
    TestPaper tp = new TestPaperA();
    tp.TestQuestion1();
    tp.TestQuestion2();
    tp.TestQuestion3();

    Console.Read();
  }
}

posted on 2012-02-21 12:04  多个马甲  阅读(183)  评论(0编辑  收藏  举报