大话设计模式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;
}

参考资料

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

模板模式|菜鸟编程

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

目录
相关文章
|
6天前
|
C++
二叉树进阶面试题(精华总结)【C++版本】
二叉树进阶面试题(精华总结)【C++版本】
|
6天前
|
设计模式 编译器 API
【C/C++ Pimpl模式】隐藏实现细节的高效方式 (Pimpl Idiom: An Efficient Way to Hide Implementation Details)
【C/C++ Pimpl模式】隐藏实现细节的高效方式 (Pimpl Idiom: An Efficient Way to Hide Implementation Details)
88 1
|
6天前
|
设计模式 中间件 程序员
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
【C/C++ 奇异递归模板模式 】C++中CRTP模式(Curiously Recurring Template Pattern)的艺术和科学
27 3
|
6天前
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
23 1
|
6天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
6天前
|
设计模式 存储 Java
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
C++从入门到精通:3.5设计模式——提升代码可维护性与可扩展性的关键
|
6天前
|
设计模式 算法 Java
小谈设计模式(11)—模板方法模式
小谈设计模式(11)—模板方法模式
|
6天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
20 0
|
6天前
|
人工智能 机器人 Linux
【C++】Linux下如何查看opencv的版本
【C++】Linux下如何查看opencv的版本
|
6天前
|
XML JSON JavaScript
推荐一个比较好用的c++版本http协议库-cpp-httplib
推荐一个比较好用的c++版本http协议库-cpp-httplib
56 1