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

  

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

  (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. 设计模式--原型(Prototype)模式

    写这些也许有人认为“为了模式而模式”.Insus.NET所想到的,每个大师成为大师之前,也许都得这样做. 走路,从小就开始学,直至现在,谁还不是为了走路而走路?一直重复着...... 很多人没有分享自 ...

  2. Windows server 2008 r2搭建FTP服务器

    最近需要搭建FTP服务器,顺着书上的教程走一遍流程. 1. 安装FTP服务 图一 图二 图三 可以看到上面提示并未启动windows自动更新,这个需要注意一下. 2. 新建FTP站点 准备FTP文件夹 ...

  3. 百度地图js根据经纬度定位和拖动定位点

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  4. MySQL服务器权限表

    MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化.这些权限表分别user,db,table_priv,columns_p ...

  5. PHP限制HTML内容中图片必须是本站的方法

    本文实例讲述了PHP限制HTML内容中图片必须是本站的方法.分享给大家供大家参考.具体实现方法如下: 1. PHP代码如下: <?php $dom = new DOMDocument; $dom ...

  6. edittext 监听内容变化

    给EditText追加ChangedListener可以监听EditText内容变化的监听 如图是效果图  类似于过滤的一种实现 1  布局也就是一个EditText,当EditText内容发生变化时 ...

  7. 泛函编程(12)-数据流-Stream

    在前面的章节中我们介绍了List,也讨论了List的数据结构和操作函数.List这个东西从外表看上去挺美,但在现实中使用起来却可能很不实在.为什么?有两方面:其一,我们可以发现所有List的操作都是在 ...

  8. php多版本管理phpenv

    曾经有试过phpbrew的童鞋应该知道有多复杂 虽然这个好久没更新了,还是可以用的-- github:phpenv/phpenv 它的原理就是处理PATH变量,将你要求的php版本的路径加到PATH的 ...

  9. bootstrap 弹出框点击其他区域时弹出框不消失选项设置

    默认情况下,bootstrap 弹出框点击其他区域时,弹出框会自动关闭,在很多时候,我们可能会希望达到和原生弹出框一样的效果,避免不小心点击其他区域时弹框自动隐藏,尤其是对于一些复杂的表单,重复填写可 ...

  10. winform(公共控件)

    一.客户端设计思路 1.理顺设计思路,架构框架 2.设计界面 3.编写后台代码 4.数据库访问 二.公共控件 1.Button(按钮): ⑴ Enabled :确定是否启用控件 ⑵ Visible:确 ...