跟我一起透彻理解template模板模式
#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模板模式的更多相关文章
- 设计模式之——Template模板模式
Template模式又叫模板模式,是在父类中定义处理流程的框架,在子类中实现具体处理逻辑的模式.当父类的模板方法被调用时程序行为也会不同,但是,不论子类的具体实现如何,处理的流程都会按照父类中所定义的 ...
- Template(模板)模式
第三章:模板模式 Template模式比较简单,是基于继承关系的一种设计模式,由父类定义处理流程框架,由子类中实现具体处理. Code: package example.template; /*** ...
- 三、Template 模板模式
需求:有规格的尺子,不管何种笔写,写出的字大小.形状都是一样的?抽象为处理流程一致,仅仅是不同的实现 代码清单: 抽象类: public abstract class AbstractDisplay{ ...
- Java设计模式(13)模板模式(Template模式)
Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: pu ...
- Java设计模式之模板模式(Template )
前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ...
- 模板模式(Template)
行为型:Template(模板模式) 作为一个曾经爱好写文章,但是不太懂得写文章的人,我必须承认,开头是个比较难的起步. 模板模式常规定义:模板模式定义了一个算法步骤,把实现延迟到子类. 事实上模板模 ...
- 设计模式之 - 模板模式(Template Pattern)
引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplica ...
- django基础2: 路由配置系统,URLconf的正则字符串参数,命名空间模式,View(视图),Request对象,Response对象,JsonResponse对象,Template模板系统
Django基础二 request request这个参数1. 封装了所有跟请求相关的数据,是一个对象 2. 目前我们学过1. request.method GET,POST ...2. reques ...
- 设计模式——模板模式(Template Pattern)
在读Spring源码的时候,发现Spring代码中运用了大量的模板模式,比如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(Clas ...
随机推荐
- hihoCoder 1403 后缀数组一·重复旋律(后缀数组+单调队列)
#1403 : 后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成 ...
- CodeForces 549H | 二分答案
参考了这个博客哇 #include<cstdio> #include<algorithm> #include<cstring> #define Max(a,b,c, ...
- BZOJ 1876 [SDOI2009] SuperGcd | PY好题
题面就是让你求两个超级大整数,求GCD 题解: 题目本意应该是出题人想考考高精度取膜 但是可以通过一种神奇的Stein算法来做 由J. Stein 1961年提出的Stein算法很好的解决了欧几里德算 ...
- this bind apply call
this 是当前函数运行时所属的对象bind 是指定一个函数运行时的上下文,也就是说把这个函数的this指向绑定到相应对象上,默认的暴露在全局御中的函数this指向widow对象, 严格模式下全局的t ...
- 【转】beyond compare 启动提示“应用程序发生错误”
[转]beyond compare 启动提示“应用程序发生错误” 今天到公司BCompare不能打开,重新安装也不能打开.最后处理下,就解决了.方法是把C:\Documents and Setti ...
- jsp的九大内置对象及EL表达式的隐含对象
九大内置对象: request request对象具有请求域,即完成客户端的请求之前,该对象一直有效. response response对象具有页面作用域,即访问一个页面 ...
- centos 安装squid http代理
yum -y install squid service squid start service iptables stop
- python任意编码转utf8或者unicode
# encoding: utf-8 ''' Created on 2015年2月8日 @author: 张鹏程 aprial@163.com @copyright: 版权所有, 尊重劳动成功, 转载与 ...
- 控制台注入DLL代码
// zhuru.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <Windows.h> #define GameC ...
- 51nod 1133 不重叠的线段【贪心/区间覆盖】
1133 不重叠的线段 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的 ...