模板模式

问题场景

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

总结模式

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

示例代码

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. BZOJ 1171: 大sz的游戏

    ZJOI讲课的题目,数据结构什么的还是很友好的说 首先我们发现题目中提到的距离\(\le L\)的东西显然可以用单调队列维护 但是暴力搞去不掉区间并的限制,那么我们考虑从区间并入手 对于这种问题的套路 ...

  2. 证明与计算(1): Decision Problem, Formal Language L, P and NP

    0x01 从判定问题到形式语言 这篇讲知识证明的wiki([1]): https://en.wikipedia.org/wiki/Proof_of_knowledge 里面有一句话: Let x be ...

  3. mysql 不同索引的区别和适用情况总结

    最近在做sql优化,看到一篇有关sql索引不错的文章,转载一下. 一.索引类型 普通索引:INDEX 允许出现相同的索引内容 (normal) 唯一索引:UNIQUE 不可以出现相同的值,可以有NUL ...

  4. 2019-04-10 集成JasperReport

    1. 报表的制作过程为 ① 制作.jrxml报表模板文件,并编译成.jasper ② 代码处理.jasper文件并填充数据进行输出 2. 一开始是打算使用iReport作为模板制作工具的,但是有以下局 ...

  5. 有这iconfont.woff文件 为什么还报404

    解决方法1.打开服务器IIS管理器,找到MIME类型. 2.添加MIME类型 添加三条: 文件扩展名 MIME类型 .svg image/svg+xml.woff application/x-font ...

  6. AWS Step Function Serverless Applications

    Installing VS Components To follow along with this article, you must have an AWS account and install ...

  7. Nginx CONTENT阶段 autoindex、index模块

    L 66 autoindex 指令 syntax : on | off; default : off; context : http,server,location; autoindex_exact_ ...

  8. python读取导出数据

    1,python读取csv的某一列 import pandas as pd data1 = pd.read_csv('cotton.csv', usecols=[0, 1], encoding='ut ...

  9. jmap -histo pid 输出的[C [B [I [S methodKlass constantPoolKlass含义

    jmap -histo pid 输出的[C [B [I [S methodKlass constantPoolKlass含义 2014年01月16日 11:00:12 lxb_champagne 阅读 ...

  10. 【CSA72G】【XSY3316】rectangle 线段树 最小生成树

    题目大意 有一个 \(n\times n\) 的矩阵 \(A\).最开始 \(A\) 中每个元素的值都为 \(0\). 有 \(m\) 次操作,每次给你 \(x_1,x_2,y_1,y_2,w\),对 ...