C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

模式设计c#--行为型--templetemethod

名称 Template Method
结构 o_templetemethod.bmp
意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M e t h o d 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
适用性
  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是O p d y k e 和J o h n s o n 所描述过的“重分解以一般化”的一个很好的例子[ O J 9 3 ]。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 控制子类扩展。模板方法只在特定点调用“h o o k ”操作(参见效果一节),这样就只允许在这些点进行扩展。

Code Example
namespace TemplateMethod_DesignPattern
{
    
using System;

    
class Algorithm 
    
{
        
public void DoAlgorithm() 
        
{
            Console.WriteLine(
"In DoAlgorithm");
            
            
// do some part of the algorithm here
            
            
// step1 goes here
            Console.WriteLine("In Algorithm - DoAlgoStep1");            
            
// . . . 

            
// step 2 goes here
            Console.WriteLine("In Algorithm - DoAlgoStep2");            
            
// . . . 

            
// Now call configurable/replacable part
            DoAlgoStep3();

            
// step 4 goes here
            Console.WriteLine("In Algorithm - DoAlgoStep4");            
            
// . . . 

            
// Now call next configurable part
            DoAlgoStep5();
        }


        
virtual public void DoAlgoStep3()
        
{
            Console.WriteLine(
"In Algorithm - DoAlgoStep3");        
        }


        
virtual public void DoAlgoStep5()
        
{
            Console.WriteLine(
"In Algorithm - DoAlgoStep5");            
        }

    }


    
class CustomAlgorithm : Algorithm
    
{
        
public override void DoAlgoStep3()
        
{
            Console.WriteLine(
"In CustomAlgorithm - DoAlgoStep3");
        }


        
public override void DoAlgoStep5()
        
{
            Console.WriteLine(
"In CustomAlgorithm - DoAlgoStep5");
        }

    }


    
/// <summary>
    
///    Summary description for Client.
    
/// </summary>

    public class Client
    
{
        
public static int Main(string[] args)
        
{
            CustomAlgorithm c 
= new CustomAlgorithm();

            c.DoAlgorithm();

            
return 0;
        }

    }

}

模板方法(Template Method)模式

准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模版方法模式的用意。

很多人可能没有想到,模版方法模式实际上是所有模式中最为常见的几个模式之一,而且很多人可能使用过模版方法模式而没有意识到自己已经使用了这个模式。模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心。

模版方法模式需要开发抽象类和具体子类的设计师之间的协作。一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤。代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本法方法总汇起来的方法叫做模版方法(template method),这个设计模式的名字就是从此而来。
 模版方法模式中的方法

模版方法中的方法可以分为两大类:模版方法(Template Method)和基本方法(Primitive Method)。

模版方法

一个模版方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个模版方法一般会在抽象类中定义,并由子类不加以修改地完全继承下来。

基本方法

基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。

抽象方法:一个抽象方法由抽象类声明,由具体子类实现。在C#语言里一个抽象方法以abstract关键字标示出来。

具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。在C#语言里面,一个具体方法没有abstract关键字。

钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。(Visual FoxPro中项目向导建立的项目会使用一个AppHook类实现监视项目成员变化,调整系统结构的工作。)钩子方法的名字通常以do开始。

posted on 2006-01-03 16:04 梦在天涯 阅读(531) 评论(0)  编辑 收藏 引用 所属分类: Design pattern


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1795777
  • 排名 - 5

最新评论

阅读排行榜