模板模式

问题场景

咖啡和茶派生于抽象类饮料,咖啡和茶都具有烧水的方法,所以可以将烧水的方法提取到抽象类饮料中去实现,而咖啡具有一个向杯子加咖啡粉的方法,茶具有一个向杯子加茶叶的方法,看起来两个方法是不同的逻辑,而抽象类在很多地方都被其它类型所引用,也即其它类型都会调用抽象类而非其子类,以便解耦依赖。所以,我们应该尽量将看起来不一样但有共同点的行为提取到抽象类中定义成抽象成员,抽象成员就像模板,模板总是靠子类帮抽象类去填充实现,这样,在运行时,调用抽象实例就可以得到这些具体的实现了。

总结模式

将看起来具有不同逻辑但具有相同行为模式的成员泛化、提取到抽象类中定义为抽象成员,这样就统一了算法的命名,具体实现则交给各个子类去完成,从而使对抽象的引用变得更合理,使解耦和调用变得更具有可能性。

示例代码

public class Coffe
{
    //烧水
    public void BoilWater( ) { }

//冲泡咖啡
    public void BrewingCoffe( ) { }

//倒入水杯
    public void InCup( ) { }

//加牛奶
    public void MilkInCup( ) { }
}

public class Tea
{
    //烧水
    public void BoilWater( ) { }

//冲泡茶叶
    public void BrewingTea( ) { }

//倒入水杯
    public void InCup( ) { }

//加柠檬
    public void LemoInCup( ) { }
}

两个类中,都有烧水和倒入水杯的方法,应提取到抽象类中定义成实例方法

public class Drink
{
    //烧水
    public void BoilWater( ) { }

//倒入水杯
    public void InCup( ) { }
}

两个类中,冲泡的对象和附加的材料虽然不一样,但可以找到它们的共同点,那就是冲泡和附加材料,虽然具体实现的细节不一样,但还是可以将它们泛化为两个相同的行为。

public abstract class Drink
{
    //烧水
    public void BoilWater( ) { }
    //倒入水杯
    public void InCup( ) { }
    //冲泡,抽象
    public abstract void Brewing( );
    //加材料,抽象
    public abstract void XxInCup( );
}

public class Coffe : Drink
{
    public override void Brewing( ) { }
    public override void XxInCup( ) { }
}

public class Tea : Drink
{
    public override void Brewing( ) { }
    public override void XxInCup( ) { }
}

  

C# - 设计模式目录

C# - 设计模式 - 模板模式的更多相关文章

  1. 12. 星际争霸之php设计模式--模板模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. 【设计模式】Java设计模式 - 模板模式

    Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  3. 设计模式——模板模式(Template Pattern)

    在读Spring源码的时候,发现Spring代码中运用了大量的模板模式,比如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(Clas ...

  4. php设计模式——模板模式

    最近打算巩固,整理一下设计模式相关的内容.这篇是关于  ——模板模式! 原文:http://www.jb51.net/article/76052.htm ----------------------- ...

  5. Spring中常见的设计模式——模板模式

    一.模板模式的应用场景 模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许自雷为一个或者多个步骤提供实现.模板模式使得子类可以在不改变算法结果的情 ...

  6. 设计模式——模板模式(C++实现)

    模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.   模板模式通过把不变的行为搬移到超类,去除子类中的重复代码来 ...

  7. Java设计模式-模板模式

    介绍:模板模式定义了一个模板抽象类,这个抽象类中定义了方法调用的形式,顺序.子类通过重写对方法进行实现,但是调用方式不能改变. 模板模式中的模板中定义了核心的代码骨架,一些有着不同方式实现的代码放在子 ...

  8. C++ 设计模式--模板模式、策略模式、观察者模式

    现代软件设计特征:需求频繁变化 设计模式的要点是"寻找变化点",在变化点应用设计模式,从而更好的应对需求变化. 1. Template Method 在软件构建结构中,往往他有整体 ...

  9. Go --- 设计模式(模板模式)

    模版模式真的是一个好东西.所谓模版模式,就是说,某几个类中相同的操作和代码提取到父类的一个函数中,并定义相同的操作为抽象函数.由子类来实现.估计我也没表达清楚,下面还是看代码来讲解吧. 例:我们有两个 ...

随机推荐

  1. DirectX11 With Windows SDK--10 摄像机类

    前言 DirectX11 With Windows SDK完整目录:http://www.cnblogs.com/X-Jun/p/9028764.html 由于考虑后续的项目需要有一个比较好的演示环境 ...

  2. 随心测试_软测基础_007<软测学习路线建议>

    如果你对软测感兴趣,那么如何学习软件测试呢? 贴心小提示:以下内容,仅供参考,不挖坑 1:学习方式_职业教育选择观 ————SX的观点:成本 | 收益说,理性接受 软测产业服务链中,测试工程师重在于& ...

  3. Fire Again CodeForces - 35C (BFS)

    After a terrifying forest fire in Berland a forest rebirth program was carried out. Due to it N rows ...

  4. 电脑突然使用不了复制粘贴快捷键,Ctrl+C和Ctrl+V没用

    今天不知道怎么回事,在复制代码的时候突然用不了Ctrl+C和Ctrl+V了 刚开始我还以为是eclipse出问题,然后我在idea中是可以复制 和 粘贴的,然后我又打开文本编辑器notepad++,发 ...

  5. Vue.js——vue-resource

    vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应. vue-resource使用 引入  npm install vue-reso ...

  6. Lodop提示BarCode Type(ena13)Invalid!

    前段时间遇到过一个奇怪的问题,就是代码里本身都是ENA13大写,却提示条码类型无效,而且进入打印设计后,选中打印项,条码类型变成了code39,但是实际是还有条码类型参数都是正确的,代码看上去没有问题 ...

  7. vue cli使用融云实现聊天

    公司有个项目要实现一个聊天功能,需求如下图,略显随意 公司最终选择融云这个吊炸天的即时通信,文档详细的一匹,刚开始看文档感觉很详细实现起来也不麻烦,有很多开源的demo可以在线演示和下载 不过我们的项 ...

  8. k8s-jenkins 自动化1

    一个流水线例子: 设置参数化构建: 流水线指令: def label = "docker-${UUID.randomUUID().toString()}" podTemplate( ...

  9. P3709 大爷的字符串题 (莫队)

    题目 P3709 大爷的字符串题 题意:求\([l,r]\)中众数的个数. 解析 维护两个数组: \(cnt[x]\),数\(x\)出现的次数. \(sum[x]\),出现次数为\(x\)的数的个数. ...

  10. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...