Welcome

首页 / 软件开发 / C# / 无废话C#设计模式之十四:Template Method

无废话C#设计模式之十四:Template Method2010-01-13 博客园 lovecherry意图

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。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();

}

}

}