模板方法(Template Method)

2017-06-23  本文已影响0人  非空白

意图

定义一个操作的算法骨架,将一些步骤延迟(实现)到子类。模板方法允许子类重新定义算法的某些步骤,而不改变算法的结构。

结构

模板方法结构图

动机

模板方法用一些抽象的操作定义一个算法,通过子类重新定义这些操作以提供具体的行为。

模板方法设定了算法中的各个抽象操作以及它们的先后顺序

适用性

实现细节



示例

考虑一个支持在屏幕上绘图的视图(View)。 视图强制其子类在进入“焦点(Focus)” 状态之后,才能进行绘图(例如,颜色和字体)。

实现(C#)

using System;

// 视图抽象基类
public abstract class View
{

   // 绘制视图的模板方法
   public void Display()
   {
       // 确保获得焦点
       SetFocus();
       DoDisplay();
       ResetFocus();
   }

   // 受保护的抽象原语操作
   protected abstract void DoDisplay();

   // 私有操作,防止子类覆盖此方法绕开规则。
   private void SetFocus()
   {
       Console.WriteLine("{0} 获得焦点" , this.GetType().FullName);
   }

   // 私有操作,防止子类覆盖此方法绕开规则。
   private void ResetFocus()
   {
       Console.WriteLine("{0} 释放焦点" , this.GetType().FullName);
   }

}

public class GridView : View
{
   //定义个性化绘图(受保护,不对外公开)
   protected override void DoDisplay()
   {
       Console.WriteLine("  ==>> 开始个性化绘图");
   }

}

public class TreeView : View
{
   //定义个性化绘图(受保护,不对外公开)
   protected override void DoDisplay()
   {
       Console.WriteLine("  ==>> 开始个性化绘图" );
   }
}

public class App
{
   public static void Main(string[] args)
   {
       View gridView = new GridView();
       View treeView = new TreeView();

       gridView.Display();
       treeView.Display();

   }
}

// 控制台输出:
//  GridView 获得焦点
//    ==>> 开始个性化绘图
//  GridView 释放焦点
//  TreeView 获得焦点
//    ==>> 开始个性化绘图
//  TreeView 释放焦点
上一篇下一篇

猜你喜欢

热点阅读