Chinaunix首页 | 论坛 | 博客
  • 博客访问: 664032
  • 博文数量: 220
  • 博客积分: 10487
  • 博客等级: 上将
  • 技术积分: 2072
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-09 00:25
文章分类

全部博文(220)

文章存档

2012年(5)

2011年(38)

2010年(135)

2009年(42)

我的朋友

分类:

2009-10-18 01:23:18

定义
 
定义某个操作算法的骨架,把某些步骤放到其子类。模板方法让子类在不改变算法结构的情况下重定义某些具体的步骤。

使用频度:



UML 类图




参与者

该模式参与的类或对象

  • AbstractClass(抽象类)
    • 定义抽象的原生操作,具体的子类实现算法步骤。
    • 定义算法的骨架,实现模板方法,其会调用抽象类定义的原生操作。
  • ConcreteClass(具体类)
    • 实现原生操作,执行算法的特定子类步骤


C# 示例代码


// Template pattern -- Structural example


using System;

 

namespace DoFactory.GangOfFour.Template.Structural

{

  ///




  /// MainApp startup class for Real-World


  /// Template Design Pattern.


  ///



  class MainApp

  {

    ///


    /// Entry point into console application.


    ///



    static void Main()

    {

      AbstractClass aA = new ConcreteClassA();

      aA.TemplateMethod();

 

      AbstractClass aB = new ConcreteClassB();

      aB.TemplateMethod();

 

      // Wait for user


      Console.ReadKey();

    }

  }

 

  ///


  /// The 'AbstractClass' abstract class


  ///



  abstract class AbstractClass

  {

    public abstract void PrimitiveOperation1();

    public abstract void PrimitiveOperation2();

 

    // The "Template method"


    public void TemplateMethod()

    {

      PrimitiveOperation1();

      PrimitiveOperation2();

      Console.WriteLine("");

    }

  }

 

  ///


  /// A 'ConcreteClass' class


  ///



  class ConcreteClassA : AbstractClass

  {

    public override void PrimitiveOperation1()

    {

      Console.WriteLine("ConcreteClassA.PrimitiveOperation1()");

    }

    public override void PrimitiveOperation2()

    {

      Console.WriteLine("ConcreteClassA.PrimitiveOperation2()");

    }

  }

 

  ///


  /// A 'ConcreteClass' class


  ///



  class ConcreteClassB : AbstractClass

  {

    public override void PrimitiveOperation1()

    {

      Console.WriteLine("ConcreteClassB.PrimitiveOperation1()");

    }

    public override void PrimitiveOperation2()

    {

      Console.WriteLine("ConcreteClassB.PrimitiveOperation2()");

    }

  }

}


输出

ConcreteClassA.PrimitiveOperation1()
ConcreteClassA.PrimitiveOperation2()


阅读(550) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~