大话设计模式C++版本-07-模板方法模式

简介: 大话设计模式C++版本-07-模板方法模式

概述

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

优点

1.封装不变部分,扩展可变部分

2.提取公共代码,便于维护

3.行为由父类控制,子类实现

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景

1.一个类有大部分的功能是一直不需要改变的

2.但有少部分的功能需要依据不同情况改变

例子:小学时,学生对着黑板抄习题时,每个人抄的题目是不变的,但每个人的答案是不同的,按照模板方法模式,可以把题目提取到父类来实现,而每个子类实现各自的答案。

一般步骤

1.写一个父类实现公共代码,把可变的用虚方法实现;

class TestPaper // 试卷类
{
public:
  void TestQuestion1()
  {
    cout << "杨过得到,后来给了郭靖 a.球;b.金;c.碳" << endl;
    cout << "答案:" <<  Answer1() << endl;
  }
  // ...其他公共代码  
  virtual string Answer1()
  {
    return "";
  }
  // ...其他可变代码
};

2.写不同条件下的子类,继承父类,并实现可变代码;

class TestPaperA : public TestPaper //A抄的试卷,实现了自己的答案
{
public:
  string Answer1()
  {
    return "b";
  }
  //  ...
};
class TestPaperB : public TestPaper //B抄的试卷,实现了自己的答案
{
public:
  string Answer1()
  {
    return "c";
  }
  // ...
};

具体实例完整代码

#include <iostream>
#include <string>
using namespace std;
class TestPaper // 试卷类
{
public:
  void TestQuestion1()
  {
    cout << "杨过得到,后来给了郭靖 a.球;b.金;c.碳" << endl;
    cout << "答案:" <<  Answer1() << endl;
  }
  void TestQuestion2()
  {
    cout << "杨过、程英、陆无双 a.害;b.绝;c.平;d.化" << endl;
    cout << "答案:" <<  Answer2() << endl;
  }
  void TestQuestion3()
  {
    cout << "蓝凤凰 a.林;b.牛;c.酸;奶" << endl;
    cout << "答案:" <<  Answer3() << endl;
  }
  virtual string Answer1()
  {
    return "";
  }
  virtual string Answer2()
  {
    return "";
  }
  virtual string Answer3()
  {
    return "";
  }
};
class TestPaperA : public TestPaper //A抄的试卷,实现了自己的答案
{
public:
  string Answer1()
  {
    return "b";
  }
  string Answer2()
  {
    return "c";
  }
  string Answer3()
  {
    return "a";
  }
};
class TestPaperB : public TestPaper //B抄的试卷,实现了自己的答案
{
public:
  string Answer1()
  {
    return "c";
  }
  string Answer2()
  {
    return "a";
  }
  string Answer3()
  {
    return "a";
  }
};
int main()
{
  cout << "studentA的试卷" << endl;
  TestPaper *studentA = new TestPaperA();
  studentA->TestQuestion1();
  studentA->TestQuestion2();
  studentA->TestQuestion3();
  cout << endl;
  cout << "studentB的试卷" << endl;
  TestPaper *studentB = new TestPaperB();
  studentB->TestQuestion1();
  studentB->TestQuestion2();
  studentB->TestQuestion3();
  return 0;
}

参考资料

程杰老师的《大话设计模式》

模板模式|菜鸟编程

如果对你有帮助的话,记得点赞收藏,如果有什么遗漏的或者有什么体会,请在评论告诉我,好东西记得分享 ^ _ ^

目录
相关文章
|
1月前
|
Linux 编译器 测试技术
【C++】CentOS环境搭建-快速升级G++版本
通过上述任一方法,您都可以在CentOS环境中高效地升级G++至所需的最新版本,进而利用C++的新特性,提升开发效率和代码质量。
152 64
|
1月前
|
Linux 编译器 测试技术
【C++】CentOS环境搭建-快速升级G++版本
通过上述任一方法,您都可以在CentOS环境中高效地升级G++至所需的最新版本,进而利用C++的新特性,提升开发效率和代码质量。
176 63
|
2月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
4月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
41 3
|
4月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
52 2
|
3月前
|
缓存 C++ Windows
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别
|
4月前
|
设计模式 JavaScript 算法
js设计模式【详解】—— 模板方法模式
js设计模式【详解】—— 模板方法模式
47 6
|
5月前
|
Linux vr&ar C语言
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
292 2
|
6月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
59 2
|
5月前
|
设计模式 算法 关系型数据库
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
系统要求所有的数据库帮助类必须实现ISqlHelp接口,面向该接口编程,如SQLServerHelp类。 此时第三方提供了一个新的MySql的帮助类(假设是dll,不能修改),它的编程规范和ISqlHelp不兼容,这个时候就需要引入适配器类,使二者能相互兼容。
168 0