模板方法模式——在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重写定义算法中的某些步骤。

  

  假如我们有两种咖啡因饮料:茶和咖啡。茶的制作过程为:

  (1)烧水

  (2)用沸水浸泡茶叶

  (3)把茶倒进杯子

  (4)加柠檬

  而咖啡的制作过程为:

  (1)烧水  

  (2)用沸水冲泡咖啡

  (3)把咖啡倒进杯子

  (4)加糖和牛奶

  我们发现两种饮料的制作有类似的过程:

  (1)烧水

  (2)用沸水泡咖啡或茶

  (3)把饮料倒进杯子

  (4)在饮料中加入适当调料

  将(1)(3)在一个抽象基类——咖啡因饮料中定义和实现,而(2)(4)在基类中定义为抽象方法,交由具体的饮料子类去实现,并且基类提供一个方法按一定顺序调用这四个方法以完成饮料的制作。

  抽象基类——咖啡因饮料

 public abstract class CaffeineBeverage
{
public void prepareRecipe()
{
boilWater();
brew();
pourInCup();
if (customerWantsCondiments())
{
addCondiments();
}
}
protected abstract void brew();
protected abstract void addCondiments();
void boilWater()
{
Console.WriteLine("Boiling water");
}
void pourInCup()
{
Console.WriteLine("Pouring in cup");
}
protected virtual bool customerWantsCondiments()//钩子
{
return true;
}
}

CaffeineBeverage

  茶
class Tea : CaffeineBeverage
{
protected override void brew()
{
Console.WriteLine("Steeping in tea");
} protected override void addCondiments()
{
Console.WriteLine("Adding lemon");
} }

Tea

  咖啡
class Coffee : CaffeineBeverage
{
protected override void brew()
{
Console.WriteLine("Dripping Coffee through filter");
}
protected override void addCondiments()
{
Console.WriteLine("Adding Sugar and Milk");
}
}

Coffee

  还可以在基类中定义钩子方法,该方法通过空的或者默认的实现,子类可有以选择性的覆盖该方法。钩子方法可以用于影响抽象基类的算法流程。
  带有钩子的咖啡:钩子用于控制是否加入调料
class CoffeeWithHook : CaffeineBeverage
{ override protected void brew()
{
Console.WriteLine("Dripping Coffee through filter");
}
override protected void addCondiments()
{
Console.WriteLine("Adding Sugar and Milk");
}
protected override bool customerWantsCondiments()
{
string answer = getUserInput();
if (answer.ToLower().StartsWith("y"))
{
return true;
}
else
{
return false;
}
}
private string getUserInput()
{
string answer = null;
Console.WriteLine("Would you like milk and sugar with your coffee(y/n)?");
try
{
answer = Console.ReadLine();
}
catch (System.Exception ex)
{
Console.WriteLine("IO error trtying to read your answer");
}
if (answer==null)
{
return "no";
}
return answer;
}
}

CoffeeWithHook

 class Program
{
static void Main(string[] args)
{
Tea myTea = new Tea();
Coffee myCoffee = new Coffee();
CoffeeWithHook CoffeeHook = new CoffeeWithHook();
myTea.prepareRecipe();
Console.WriteLine("");
myCoffee.prepareRecipe();
Console.WriteLine("");
CoffeeHook.prepareRecipe();
Console.ReadKey();
}
}

Program

设计模式C#实现(一)——模板方法模式的更多相关文章

  1. 设计模式 : Template method 模板方法模式 -- 行为型

      设计模式中,模板模式面向的是方法级别的流程.(不过好像世界上大部分问题,都可以抽象点.抽象点吧,最后抽象到一个方法里面吧.) 1. 一个方法,可以用来描述一个流程,这个流程涉及多个环节,不同环节可 ...

  2. 《Head First 设计模式》学习笔记——模板方法模式

    模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以详细方法以及详细构造函数的形式实现.然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类能够以不同的方式实现这些抽象方法,从而对剩余的逻辑有 ...

  3. C#设计模式之十四模板方法模式(Template Method)【行为型】

    一.引言 “结构型”的设计模式已经写完了,从今天我们开始讲“行为型”设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Patte ...

  4. headfirst设计模式(9)—模板方法模式

    前言 这一章的模板方法模式,个人感觉它是一个简单,并且实用的设计模式,先说说它的定义: 模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式.让子类别在不改变算法架构的情况下, ...

  5. 设计模式(22)--Template Method(模板方法模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声 ...

  6. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]

    模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override).   1   2{<HeadFirst设计模式>之模板方法模式 }   3{ 编译工具: Del ...

  7. C#设计模式(14)——模板方法模式

    1.模板方法模式介绍 提到模板我们经常会想到简历模板/PPT模板等,以简历模板为例,不同的人可以使用一样的简历模板,在填充内容时根据自己的名字/工作经历等填写自己的内容,从而形成不同的简历.在OO中模 ...

  8. js设计模式(七)---模板方法模式

    模板方法模式 模板方法模式是一种只需要继承就可以实现的非常简单的模式. 模板方法模式是由两部分组成,第一部分是抽象父类,第二部分是具体实现的子类, 主要适用在同级的子类具有相同的行为放在父类中实现,而 ...

  9. JS设计模式(8)模板方法模式

    什么是模板方法模式? 定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 主要解决:一些方法通用,却在每一个子类都重新 ...

随机推荐

  1. js页面跳转整理(转载未整理)

    js方式的页面跳转1.window.location.href方式    <script language="JavaScript" type="text/java ...

  2. 数论 - 组合数学 + 素数分解 --- hdu 2284 : Solve the puzzle, Save the world!

    Solve the puzzle, Save the world! Problem Description In the popular TV series Heroes, there is a ta ...

  3. Linux - root初始密码设置

    Ubuntu刚安装后,不能在terminal中运行su命令,因为root没有默认密码,需要手动设定. 以安装ubuntu时输入的用户名登陆,该用户在admin组中,有权限给root设定密码. 给roo ...

  4. spring.net中的IOC和DI-初使用

    前面准备:下载spring.net并解压 下载地址:spring.net下载地址 Ioc:控制反转         DI:依赖注入 一.IOC(控制反转) 1.新建一个控制台程序springTest, ...

  5. 【JavaScript回顾】继承

    组合继承 组合继承(combination inheritance),有时候也叫做伪经典继承,指的是将原型链和借用构造函数的 技术组合到一块,从而发挥二者之长的一种继承模式.其背后的思路是使用原型链实 ...

  6. java 接口学习

    你应该知道接口是一种契约,它与实现方式无关 但是类,即使是抽象类,你都能自定义成员变量,而成员变量往往就与实现方式有关. 这一点的实际意义不大. 但是有一点,类会暴露太多不必要,甚至不能暴露的东西,你 ...

  7. x3dom 1.6 发布

    X3DOM 库的1.6版本发布了,以下是最重要的一些变化: 完整的新的文档频道 -  http://doc.x3dom.org x3dom实例频道 - http://examples.x3dom.or ...

  8. x3d 规范 在线镜像版

    国内访问web网站不稳定,在此部署一个国内的在线版本,供有需要的同学查阅. 注:已失效 x3d规范文档: https://code.csdn.net/x3dcn/x3d-specification-d ...

  9. 开源论坛MvcForum推荐

    MvcForum算是Asp.net中开源论坛佼佼者之一.主要使用ASP.NET MVC 5 &Unity & Entity Framework 6,有较强的可撸性.是论坛开发者的不二之 ...

  10. Metronic 使用到的开源插件汇总

    Metronic 是一套完整的 UI 模板,但不仅仅是模板,更应该说是一个 UI 框架.它除了提供了大量网页模板,也提供了非常多的 UI 组件,并且应用了众多 jQuery 插件.通过这些资源的整合, ...