#include <iostream>
using namespace std;
//template模式。 class Base
{
public:
void DealWhat()
{
this->Printf1();
this->Printf2();
}
protected:
virtual void Printf1() = 0;
virtual void Printf2() = 0;//让子类实现算法的详细实现。
}; class Son1 : public Base
{
public:
void Printf1()
{
cout << "Son1::Printf1()" << endl;
}
void Printf2()
{
cout << "Son1::Printf2()" << endl;
}
}; class Son2 : public Base
{
public:
void Printf1()
{
cout << "Son2::Printf1()" << endl;
}
void Printf2()
{
cout << "Son2::Printf2()" << endl;
}
}; int main()
{
Base *b = new Son2();
b->DealWhat();
return 0;
}

感悟:

基类的方法由不同子类去详细实现,我们须要什么详细的算法

或者算法,直接构造相关的子类就能够使用,可是公共接口还

是定义在基类中,这样方便全部的子类都能够利用C++多态机制进行覆盖改写。

以下是我的详细事例详细解释:

#include <iostream>
using namespace std;
//template模式。 class Base
{
public:
Base(int a[],int n)
{
data = new int[n];
int i = 0;
for (; i < n; i++)
{
data[i] = a[i];
}
size = n;
}
void Printf()
{
int i = 0;
for (; i < size; i++)
{
cout << data[i] << " ";
}
cout << endl;
}
void DoWhat()
{
this->sort();
//算法的详细实现交给不同的子类来实现,我们通过共同拥有的接口来调用。 }
protected:
virtual void sort() = 0;//排序方法的实现。
int *data;
int size;
};
class Bubble : public Base//冒泡排序。 {
public:
Bubble(int a[], int n) :Base(a, n){}
void sort()
{
int i = 0;
int temp;
for (; i < size; i++)
{
for (int j = 0; j<(size-i-1); j++)
{
if (data[j+1]<data[j])
{
temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
}
}
}
}
};
class Insert : public Base//插入排序。 {
public:
Insert(int a[], int n) :Base(a, n){}
void sort()
{
int i = 0;
int j;
int k;
int temp;
for (; i < size; i++)
{
j = i;
temp = data[i];
for (k = 0; k <= i; k++)
{
if (data[k]>temp)
{
break;
}
}
for (; j > k; j--)
{
data[j] = data[j - 1];
}
data[j] = temp;
}
}
};
class Qulick : public Base//高速排序。
{
public:
Qulick(int a[], int n) :Base(a, n){}
void sort()
{
sort(data,0,size);
}
private:
void sort(int a[], int low, int high)
{
int i = -1;
int j = 0;
if ( low>=high )return;
int key = data[high-1];
int temp;
while (j<high)
{
while (data[j]>key)j++;
i++;
temp = data[i];
data[i] = data[j];
data[j] = temp;
j++;
}
data[i] = key;
sort(a,0,i-1);
sort(a,i+1,high);
}
};
class Select : public Base//选择排序。
{
public:
Select(int a[], int n) :Base(a, n){}
void sort()
{
int i = 0;
int j;
int temp;
for (; i < size - 1; i++)
{
for (j = i + 1; j < size; j++)
{
if (data[i]>data[j])
{
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
}
}; int main()
{
int a[] = { 4, 6, 7, 9, 1, 23, 4 };
/*Base *p = new Qulick(a, 7);
p->DoWhat();
p->Printf();//插入排序。 */
Base *p = new Bubble(a,7);
p->DoWhat();
p->Printf();//冒泡排序。 return 0;
}

跟我一起透彻理解template模板模式的更多相关文章

  1. 设计模式之——Template模板模式

    Template模式又叫模板模式,是在父类中定义处理流程的框架,在子类中实现具体处理逻辑的模式.当父类的模板方法被调用时程序行为也会不同,但是,不论子类的具体实现如何,处理的流程都会按照父类中所定义的 ...

  2. Template(模板)模式

    第三章:模板模式 Template模式比较简单,是基于继承关系的一种设计模式,由父类定义处理流程框架,由子类中实现具体处理. Code: package example.template; /*** ...

  3. 三、Template 模板模式

    需求:有规格的尺子,不管何种笔写,写出的字大小.形状都是一样的?抽象为处理流程一致,仅仅是不同的实现 代码清单: 抽象类: public abstract class AbstractDisplay{ ...

  4. Java设计模式(13)模板模式(Template模式)

    Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: pu ...

  5. Java设计模式之模板模式(Template )

    前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ...

  6. 模板模式(Template)

    行为型:Template(模板模式) 作为一个曾经爱好写文章,但是不太懂得写文章的人,我必须承认,开头是个比较难的起步. 模板模式常规定义:模板模式定义了一个算法步骤,把实现延迟到子类. 事实上模板模 ...

  7. 设计模式之 - 模板模式(Template Pattern)

    引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplica ...

  8. django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统

    Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...

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

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

随机推荐

  1. Python空间数据处理环境搭

    Python空间数据处理环境搭 Conda的下载和安装 什么是Conda? 官方定义:Package, dependency and environment management for any la ...

  2. 【BZOJ 5048 塌陷的牧场】

    Time Limit: 25 Sec  Memory Limit: 256 MBSubmit: 77  Solved: 34[Submit][Status][Discuss] Description ...

  3. linux中sed工具的使用

    sed 本身也是一个管线命令,而且 sed 还可以将数据进行取代.删除.新增.撷取特定行等等的功能. $ sed [-nefr] [动作] 选项与参数: -n :使用安静(silent)模式.在一般 ...

  4. poj 3678 Katu Puzzle 2-SAT 建图入门

    Description Katu Puzzle is presented as a directed graph G(V, E) with each edge e(a, b) labeled by a ...

  5. [03] html 中引入与使用css

    1. 使用style属性 <a style="color: red;"> hello ,there use style attribute</a> 2. l ...

  6. php 字符串重要函数

    1.chop() 从字符串右端移除字符 chop(string,charlist) $str="hello world~"; echo chop($str,"ld~&qu ...

  7. gitHub优秀android项目

    转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...

  8. tips server ssh 正向 反向 代理

    1. ssh userxxxxname@115.28.87.102           (直接使用ssh的连接方式连接到远程主机,而不是使用http,ftp等方式连接到具体远程主机)          ...

  9. Sqlite 修改字段的名称。

    Sqlite 不支持直接修改字段的名称. 我们可以使用别的方法来实现修改字段名. 1.修改原表的名称 ALTER TABLE table RENAME TO tableOld; 2.新建修改字段后的表 ...

  10. malloc()之后,内核发生了什么?【转】

    转自:http://blog.csdn.net/qianlong4526888/article/details/9042835 [-] 1brk系统调用服务例程 2扩大堆 3缺页异常的处理过程 31d ...