无废话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 意图        定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。 场景      ...

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

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

JAVA--模版方法模式(Template Method)--设计模式十四

1,概述:        (1)模版方法模式的意图是在一个方法里实现一个算法,并推迟定义算法的某些步骤, 从而让其他类重新定义他们              ...

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

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

无废话C#设计模式之一:开篇

无废话C#设计模式之一:开篇 什么是设计模式?        什么是少林拳呢?少林拳是少林僧人经过长期的总结,得出的一套武功套路。有一本叫做少林拳法的武功秘籍,上面记载这这套拳法的适用人群,打法套路和...

无废话C#设计模式之十五:Strategy

无废话C#设计模式之十五:Strategy 意图        定义一系列的算法,把它们一个一个封装起来,并且使它们可相互替换。本模式使得算法可以独立于它的客户而变化。 场景   ...

无废话C#设计模式之十八:Command

无废话C#设计模式之十八:Command 意图        将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 场景  &#...

无废话C#设计模式之二:Singleton

无废话C#设计模式之二:Singleton 意图        保证一个类只有一个实例,并提供访问它的全局访问点。 场景        我们...

无废话C#设计模式之十二:Bridge

无废话C#设计模式之十二:Bridge 意图        将抽象部分与实现部分分离,使它们都可以独立的变化。 场景 还是说我们要做的网络游戏,多个场景需要扩充的问题我们已经采用了创建型模式来解决。现...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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