无废话C#设计模式之十四:Template Method

转载 2011年01月18日 15:57:00

无废话C#设计模式之十四:Template Method

 

意图

 

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

 

场景

 

模版方法是非常容易理解的设计模式,一来是因为它没有过多结构上的交错,二来是因为这种代码复用技术对于掌握OO知识的人来说非常容易可以想到,很可能你已经在很多地方运用了模版方法。在运用一些设计模式的时候常常也会一起运用模版方法,甚至有的设计模式本身就带有模版方法的思想。

今天,我们给出这样一个实际的例子。做过银行支付、支付宝支付的人都知道,一个支付的过程是基于两个接口的。提交接口和网关返回接口,虽然各大网关的支付接口格式不同,比如有的网关对于支付金额的参数是money,有的网关又是amount,但是从支付的提交过程来说,我们一般都会经历以下步骤:

l         获取订单信息,验证订单的合法性

l         生成用于提交到各大网关的表单

l         记录日志

l         把表单提交到相应的网关

对于各个网关,生成的提交表单以及记录日志的方式是不一样的,但是整个支付流程以及流程中的获取订单信息、提交表单的过程是一样的。由此引入模版方法模式来复用不变的部分,把可变的部分留给子类去实现。

 

示例代码

 

using System;

using System.Collections.Generic;

using System.Text;

 

namespace TemplateMethodExample

{

    class Program

    {

        static void Main(string[] args)

        {

            PayGateway pg = new IPSGateway();

            pg.SubmitOrder(new Order());

        }

    }

 

    class Order

    {

    }

 

    class SubmitForm

    {

    }

 

    abstract class PayGateway

    {

        protected abstract void WriteLog(SubmitForm sf);

        protected abstract SubmitForm GenerateOrderForm(Order order);

 

        public void SubmitOrder(Order order)

        {

            if (order == null)

            {

                Console.WriteLine("Invalid Order");

                return;

            }

            SubmitForm sf = GenerateOrderForm(order);

            if (sf == null)

            {

                Console.WriteLine("Generate Submit Form Failed");

                return;

            }

            WriteLog(sf);

        }

    }

 

    class IPSGateway : PayGateway

    {

        protected override void WriteLog(SubmitForm sf)

        {

            Console.WriteLine("Log Wrote");

        }

 

        protected override SubmitForm GenerateOrderForm(Order order)

        {

            Console.WriteLine("Submit Form Generated");

            return new SubmitForm();

        }

    }

}

代码执行结果如下图:

 

 

代码说明

 

l         PayGateway类型是抽象模版角色。它定义了支付过程不变的部分,并且把变化部分定义为抽象操作,让子类去实现。其中的SubmitOrder方法是模版方法。

l         IPSGateway类型是具体模版角色。它代表了某一种支付网关,并且按照这种支付网关的接口标准来实现生成提交表单和记录日志的操作。

 

何时采用

 

l         如果某些类型的操作拥有共同的实现骨架和不同的实现细节的话,可以考虑使用模版方法来封装统一的部分。

 

实现要点

 

l         复用算法的骨架,将可变的实现细节留给子类实现。

l         留给子类实现的方法需要在父类中定义,可以是抽象方法也可以是带有默认实现的方法。

 

注意事项

 

l         模版方法可以说是最不像设计模式的设计模式,通常很多设计模式会和模版方法一起使用。

无废话C#设计模式之四:Factory Method

无废话C#设计模式之四:Factory Method 意图        定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 场景        上次,我们使用抽象工厂解决了生产一组产品的问...
  • rise51
  • rise51
  • 2011年01月18日 10:48
  • 225

浅谈Java设计模式(十四)模板方法模式(Template Method)

前言: 解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,...

C#设计模式之模板方法模式(Template Method)

一、引言 提到模板,大家肯定不免想到生活中的“简历模板”、“论文模板”、“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,...

Template Method模板方法设计模式(类行为型)

概述在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序。但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关。 例子1:银...

Java设计模式透析之 —— 模板方法(Template Method)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8744002 今天你还是像往常一样来上班,一如既往地开始了你的编程...

Android设计模式之美---Template Method

先解释一下设计模式之美,美体现在哪里? 任何实现代码的方法都没有美丑之分,之后复杂与简单之分,人们喜欢简单的,害怕、厌烦、排斥复杂的。 设计模式之美就体现在可以把复杂的东西简单化,让人们用起来很简单,...

Template Method设计模式

Template Method模板方法模式是一种行为型模式,具体点说是行为类型模式。主要解决在软件构建过程中,对于某一项任务,常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有...

Java设计模式 模板方法(Template Method)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8744002 今天你还是像往常一样来上班,一如既往地开始了你的编程工作。 项目经...
  • jwc2436
  • jwc2436
  • 2015年06月11日 17:03
  • 383

Java设计模式—模板方法(Template Method)

模板是指在薄片塑料板上面写字后挖空,再使用毛笔或色笔涂满挖空部分,就能看到纯手工而以不失工整的字样,看到模板上的挖空形状,马上就知道最后会变出什么样子的字,不过实际上所显现出来的字样还是要依所使用的画...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:无废话C#设计模式之十四:Template Method
举报原因:
原因补充:

(最多只允许输入30个字)