//---------------------------15/04/28----------------------------

//TemplateMethod 模版方法模式----类行为型模式

/*

1:意图:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变

一个算法的结构即可重定义该算法的某些特定步骤。

2:动机:

3:适用性:

1>一次性实现算法的不变的部分,并将可变的行为留给子类来实现。

2>各子类中的公共行为应被提取出来并集中到一个公共父类中以避免代码重复。

3>控制子类的扩展。

4:结构:

AbstractClass:

TemplateMethod()

{   ...                 //这些...的地方是固定的,子类无权改变

PrimitiveOperation1()

...

PrimitiveOperation2()

...

}

PrimitiveOperation1

PrimitiveOperation2

|

|

|

ConcreteClass:

PrimitiveOperation1()

PrimitiveOperation2() //可重新实现的两个类

5:参与者:

1>AbstractClass:

1)定义抽象的原语操作,具体的子类将重新定义它们以实现一个算法的各步骤。

2)实现一个模板方法,定义一个算法的骨架。该模版不仅调用原语操作,也调用定义在AbstractClass

或其他对象中的操作。

2>ConcreteClass:

实现原语操作以完成算法中与特定子类相关的步骤。

6:协作:

ConcreteClass靠AbstractClass来实现算法中不变的步骤。

7:效果:

1>具体操作。

2>具体的AbstractClass的操作

3>原语操作

4>Factory Method

5>钩子操作。它提供了缺省的行为,子类可以在必要时进行扩展。

要注意什么是原语操作(pure virtual函数)什么事钩子操作(有默认实现的virtual函数)

8:实现:

1>使用C++访问控制:

原语操作可以被定义为保护成员。这保证它们只可被模版方法调用(其实也可以定义为private成员,因为

子类需要做的只是重新实现定义,而不是去使用)。原语操作必须是纯虚函数,模版方法自身可以定义为

非虚成员函数。

2>尽量减少原语操作:

定义模板方法的一个重要目的就是尽量减少一个子类具体实现该算法时必须重定义的那些原语操作的数目。

3>命名约定:

可以给必须重定义的操作加上前缀以识别他们。

9:代码示例:                                                                     */

//假设MyView继承自View DoDisplay就是钩子操作,因为DoDisplay需要一个默认实现

void View::Display()

{

//设置焦点才能显示东西

SetFocus();

//子类可重定义的操作

DoDisplay();

//最后把焦点移除

ResetFocus();

}

void view::DoDisplay() {}

void MyView::DoDisplay()

{

//render the view's contents

//做一些自己想做的事,随便显示什么东西都可以

}

设计模式 笔记 模版方法模式 Template Method的更多相关文章

  1. 模版方法模式(Template Method)

    1.概念 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型 ...

  2. .NET设计模式(16):模版方法(Template Method)(转)

    摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要. 主要内容 1.概述 2.Template Method解说 3..NET中的Te ...

  3. 设计模式 ( 十九 ) 模板方法模式Template method(类行为型)

      设计模式 ( 十九 ) 模板方法模式Template method(类行为型) 1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行 ...

  4. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  5. 设计模式之模版方法模式(Template Method Pattern)

    一.什么是模版方法模式? 首先,模版方法模式是用来封装算法骨架的,也就是算法流程 既然被称为模版,那么它肯定允许扩展类套用这个模版,为了应对变化,那么它也一定允许扩展类做一些改变 事实就是这样,模版方 ...

  6. 设计模式-03工厂方法模式(Factory Method Pattern)

    插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...

  7. JS常用的设计模式(10)——模版方法模式

    模式方法是预先定义一组算法,先把算法的不变部分抽象到父类,再将另外一些可变的步骤延迟到子类去实现.听起来有点像工厂模式( 非前面说过的简单工厂模式 ). 最大的区别是,工厂模式的意图是根据子类的实现最 ...

  8. 【设计模式】工厂方法模式 Factory Method Pattern

    在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...

  9. 二十四种设计模式:工厂方法模式(Factory Method Pattern)

    工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...

随机推荐

  1. 【mysql数据库】Linux下mysql安装连接全过程(含有问题详解)

    本次安装操作在腾讯云上实现(版本:CentOS Linux release 7.4.1708 (Core) ). 根据教程实现(中途各种挖坑,填坑...),地址:http://www.runoob.c ...

  2. python之demo1----改编自turtle.py文件中的demo

    """ 改编自turtle.py自带demo 执行 python -m turtledemo 命令查看系统内置demo的源码 绘制:需要通过import turtle引入 ...

  3. 灰度发布:灰度很简单,发布很复杂&灰度发布(灰度法则)的6点认识

    什么是灰度发布,其要点有哪些? 最近跟几个聊的来的同行来了一次说聚就聚的晚餐,聊了一下最近的工作情况如何以及未来规划等等,酒足饭饱后我们聊了一个话题“灰度发布”. 因为笔者所负责的产品还没有达到他们产 ...

  4. MySQL: Connection Character Sets and Collations

    character_set_server collation_servercharacter_set_databasecollation_database character_set_clientch ...

  5. shell變量和數組

    我們要知道shell是一個很重要的腳本能幫助我們完成很多事情 shell語言其實和很多的語言的語法是差不多的 變量: 變量的定義很簡單的,但是等號兩邊是不可以有空格的(不能有空格) 命名只能使用英文字 ...

  6. HTML5 学习总结(三)——本地存储(localStorage、sessionStorage、WebSqlDataBase、IndexedDB)

    HTML5问世以后,前端加入了一个重要的功能,便是本地存储,本地存储可分为4类: Local Storage:总的存储量有所限制,并不能提供真正的检索API,数据的生命期比窗口或浏览器的生命期长,数据 ...

  7. [BZOJ 4763]雪辉

    [BZOJ 4763] 雪辉 题意 给定一棵 \(n\) 个点的无根树, 点带权. \(q\) 次询问, 每次给定树上的若干路径, 求这些路径上的点共有多少种不同权值以及这些点的权值组成的集合的 \( ...

  8. Linux命令——压缩和解压缩

    Linux命令--压缩和解压缩 尽管文件后缀名在Linux中没什么用,但还是来看看: .gz:表示由gzip压缩工具压缩的文件 .bz2:表示由bzip2压缩工具压缩的文件 .tar:表示由tar打包 ...

  9. Null和undefined的区别?

    (1)null是一个表示”无”的对象,转我数值是为0,undefined是一个表示”无”的原始值,转为数值时为NaN.当声明的变量还未被初始化时,能量的默认值为undefined (2)Null用来表 ...

  10. android 自定义listview无法响应点击事件OnItemClickListener

    如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView的Item能被选中的基础是它能获取Focus,也就是说我 ...