#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. OAuth2.0 用户验证授权标准 理解

    OAuth2.0是一套标准. 一.问题 这个标准解决了这样的一个问题. 允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.  ...

  2. 刷新iframe

    <button onclick="document.getElementById('frame').contentWindow.location.reload(true)"& ...

  3. Velocity模版使用

    <!-- https://mvnrepository.com/artifact/org.apache.velocity/velocity --> <dependency> &l ...

  4. 重量WeightFormatUtil辅助类

    package com.jlb.scan.util; import java.text.DecimalFormat; public class WeightFormatUtil { public st ...

  5. [摸鱼] 配置的vim的使用攻略!

    vim使用攻略 <>=f 折叠与缩进 开:<>[^fuck]cc 关:<>cu 缩进一块使用V选中,按>> [Ctrl]V 以列为单位选 za,打开或关 ...

  6. [Oracle] Setup DataGuard

    Oracle一步步搭建DataGuard DataGuard环境: OS: SuSe 10 Primary DB: IP address:1.1.1.1 user:root passwd:****** ...

  7. JMM内存模型+volatile+synchronized+lock

    硬件内存模型: Java内存模型: 每个线程都有一个工作内存,线程只可以修改自己工作内存中的数据,然后再同步回主内存,主内存由多个内存共享. 下面 8 个操作都是原子的,不可再分的: 1)  lock ...

  8. shiro配置参考(二)可以和mybatis的配置放在一个文件中(不建议这样,可以拆分开来,注意相关配置即可)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. linux nbd & qemu-nbd

    网络块设备:  Network Block Device   可以将一个远程主机的磁盘空间,当作一个块设备来使用.就像一块硬盘一样. 使用它,你可以很方便的将另一台服务器的硬盘空间,增加到本地服务器上 ...

  10. 二十六个月Android学习工作总结【转】

    原文:二十六个月Android学习工作总结 1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍.     2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该 ...