设计模式笔记 13. TemplateMethod 模板方法模式(行为型模式)

行为型模式

 

13. Template Method   模板方法模式      2008-08-28

无处不在的Template Method

——如果你只想掌握一种设计模式,那么它就是Template Method,这是李建忠老师说过的一句话,说明了Template Method这个模式的重要性和常用性。

动机(Motivation

在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。

如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

意图(Intent

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

——《设计模式》GoF

 

基本代码:

// 实现了一个模板方法,定义了算法的骨架,具体子类将重定义PrimitiveOperation以实现一个算法的步骤
     abstract   class  AbstractClass
    {
        
public   abstract   void  PrimitiveOperation1();
        
public   abstract   void  PrimitiveOperation2();

        
public   void  TemplateMethod()
        {
            PrimitiveOperation1();
            PrimitiveOperation2();
            Console.WriteLine(
"" );
        }
    }

 
     // ConcreteClassA,实现PrimitiveOperation以完成算法中与特定子类相关的步骤
     class  ConcreteClassA : AbstractClass
    {
        
public   override   void  PrimitiveOperation1()
        {
            Console.WriteLine(
" 具体类A方法1的实现 " );
        }

        
public   override   void  PrimitiveOperation2()
        {
            Console.WriteLine(
" 具体类B方法2实现 " );
        }
    }

    
// ConcreteClassB,实现PrimitiveOperation以完成算法中与特定子类相关的步骤
     class  ConcreteClassB : AbstractClass
    {
        
public   override   void  PrimitiveOperation1()
        {
            Console.WriteLine(
" 具体类B方法1实现 " );
        }
        
public   override   void  PrimitiveOperation2()
        {
            Console.WriteLine(
" 具体类B方法2实现 " );
        }
    }

 

客户端代码:

     class  Program
    {
        
static   void  Main( string [] args)
        {
            AbstractClass c;
            c 
=   new  ConcreteClassA();
            c.TemplateMethod();

            c 
=   new  ConcreteClassB();
            c.TemplateMethod();

            Console.Read();
        }
    }

  

Template Method的几个要点:

Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。

除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。

在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法.

适用性

1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

3.控制子类扩展。

 

 

 

转载于:https://www.cnblogs.com/MaoBisheng/archive/2008/08/31/1280618.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值