当前位置:   article > 正文

C++11 设计模式1. 模板方法(Template Method)模式学习。UML图

C++11 设计模式1. 模板方法(Template Method)模式学习。UML图

一 什么是 "模板方法(Template Method)模式"

在固定步骤确定的情况下,通过多态机制在多个子类中对每个步骤的细节进行差异化实现,这就是模板方法模式能够达到的效果。

模板方法模式属于:行为型模式。

二 "模板方法(Template Method)模式"能解决什么样子的问题

在固定步骤确定的情况下。

通过多态机制在各个子类中实现每个步骤的具体细节。

举例:

2020年1月1号,A公司有一个小游戏项目组开始开发一款游戏——开发单机闯关打斗类游戏(类似街机打拳类游戏)。

游戏策划需求:游戏主角都是个战士(攻击力不够强,生命值比较多,抗揍),主角通过不断的往前走来闯关,遇到敌人就进行攻击,

主角:生命值——1000(为0时主角死亡,游戏结束),魔法值——0(暂时用不上,保留),攻击力——200(打敌人一下敌人失去多少点声明值) 三个属性。

         //敌人也会反击,敌人也会距离近时主动攻击主角。
         //主角:生命值——1000(为0时主角死亡,游戏结束),魔法值——0(暂时用不上,保留),攻击力——200(打敌人一下敌人失去多少点声明值) 三个属性。
         //技能“燃烧”——使用该技能可以使附近所有敌人每人失去500点生命值,但是主角自身也会损失掉300点生命值。

2020年2月1号,游戏扩展,增加 法师 作为主角

    //增加 法师 作为主角(攻击力很强,生命值比较少,不抗揍)
        //主角:生命值——800,魔法值——200(暂时用不上,保留),攻击力——300  三个属性。 
        //技能“燃烧”——使用该技能可以使附近所有敌人每人失去650点生命值,但是主角自身会损失掉100点魔法值。

2020年3月1号,游戏扩展,增加牧师 作为主角
 

    //增加 牧师 作为主角(攻击力很弱,生命值比较少,不抗揍)
        //主角:生命值——300,魔法值——500(暂时用不上,保留),攻击力——200  三个属性。 
        //技能“燃烧”——使用该技能可以使附近所有敌人每人失去200点生命值,给自身英雄恢复200点生命值,但是主角自身会损失掉200点魔法值。

2020年4月1号, 还有扩展,5.1还有扩展。。。。

我们能知道的是:随着游戏的变化,我们应该怎么设计呢?我们和游戏策划讨论后,规定:后续不管有多少新加入的角色,他的技能都可以分为如下的几种,

1.对于敌人的影响

2.对于自己数值的影响(包括友军)

3.动画效果(在这里,假定只有一种动画,这里只是想处理没有 差别的具体的方法实现,实际开发过程中,每次打击的动画效果,都应该不一样才合理)

4.自身特殊的技能(例如节假日搞的一些活动)

由于技能攻击行为每一个步骤都是确定的,那么 针对 这个攻击的行为,我们在这里使用 "模版方法"来完成

三 "模板方法(Template Method)模式"的一般实现

  1. // 001templatemethod.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
  2. // 模版方法模式
  3. //战士主角:生命值——1000(为0时主角死亡,游戏结束),魔法值——0(暂时用不上,保留),攻击力——200(打敌人一下敌人失去多少点声明值) 三个属性。
  4. //技能“燃烧”——使用该技能可以使附近所有敌人每人失去500点生命值,但是主角自身也会损失掉300点生命值。
  5. //法师主角(攻击力很强,生命值比较少,不抗揍)
  6. //主角:生命值——800,魔法值——200(暂时用不上,保留),攻击力——300 三个属性。
  7. //技能“燃烧”——使用该技能可以使附近所有敌人每人失去650点生命值,但是主角自身会损失掉100点魔法值。
  8. //注意,在此程序中,我们只是用了 生命值,魔法值,和“燃烧”技能的参数,目的是为了学习 “模版方法”。
  9. #include <iostream>
  10. #include <string>
  11. #include <crtdbg.h>
  12. using namespace std;
  13. //Hero 为父类,代表每个英雄的共同点
  14. class Hero {
  15. public:
  16. Hero(string name,int left,int magic):m_name(name),m_left(left),m_magic(magic) {
  17. }
  18. virtual ~Hero() {
  19. }
  20. public:
  21. //1.对于敌人的影响
  22. // 2.对于自己数值的影响(包括友军)
  23. // 3.动画效果(在这里,假定只有一种动画,这里只是想处理没有 差别的具体的方法实现,实际开发过程中,每次打击的动画效果,都应该不一样才合理)
  24. // 4.自身特殊的技能(例如节假日搞的一些活动)
  25. void JNattack() {
  26. if (!canuseJN()) {
  27. return;
  28. }
  29. effortEnemy();
  30. effortSelf();
  31. animation_effects();
  32. selfCustomize();
  33. }
  34. private:
  35. virtual void effortEnemy()=0;
  36. virtual void effortSelf()=0;
  37. void animation_effects() {
  38. cout << "Hero's animation_effects" << endl;
  39. }
  40. virtual void selfCustomize()=0;
  41. virtual bool canuseJN()=0;
  42. protected:
  43. string m_name; //名字
  44. int m_left; //生命值
  45. int m_magic;// 蓝量
  46. };
  47. //1.战士
  48. class zhanshiHero :public Hero {
  49. public :
  50. zhanshiHero(string name, int left, int magic) :Hero(name, left, magic) {
  51. }
  52. private:
  53. virtual void effortEnemy() {
  54. cout << "zhanshiHero JNattack effortEnemy " << endl;
  55. }
  56. virtual void effortSelf() {
  57. cout << "zhanshiHero JNattack effortSelf left-200 " << endl;
  58. m_left -= 300;
  59. }
  60. virtual void selfCustomize() {
  61. cout << "zhanshiHero JNattack selfCustomize something " << endl;
  62. }
  63. virtual bool canuseJN() {
  64. if (this->m_left - 300 >= 0) {
  65. cout << "zhanshi 血量剩余: " << this->m_left << " 可以使用技能" << endl;
  66. return true;
  67. }
  68. else {
  69. cout << "zhanshi 血不够300,无法使用技能 血量剩余" <<this->m_left << endl;
  70. return false;
  71. }
  72. }
  73. };
  74. //2.法师
  75. class fashiHero :public Hero {
  76. public:
  77. fashiHero(string name, int left, int magic) :Hero(name, left, magic) {
  78. }
  79. private:
  80. virtual void effortEnemy() {
  81. cout << "fashiHero JNattack effortEnemy " << endl;
  82. }
  83. virtual void effortSelf() {
  84. cout << "fashiHero JNattack effortSelf magic-100 " << endl;
  85. m_magic -= 100;
  86. }
  87. virtual void selfCustomize() {
  88. cout << "fashiHero JNattack selfCustomize something " << endl;
  89. }
  90. virtual bool canuseJN() {
  91. if (this->m_magic - 100 >= 0) {
  92. cout << "fashi 蓝量剩余: " << this->m_magic << " 可以使用技能" << endl;
  93. return true;
  94. }
  95. else {
  96. cout << "fashi 蓝量剩余: " << this->m_magic << " 无法使用技能" << endl;
  97. return false;
  98. }
  99. }
  100. };
  101. int main()
  102. {
  103. std::cout << "Hello World!\n";
  104. zhanshiHero *pherozs = new zhanshiHero("zszhangsan", 1000, 0);
  105. Hero *pherofs = new fashiHero("fslisi", 800, 200);
  106. //Hero *pherofs1111111111 = new fashiHero("aaaa", 80880, 2800);
  107. pherozs->JNattack();
  108. pherozs->JNattack();
  109. pherozs->JNattack();
  110. pherozs->JNattack();
  111. pherozs->JNattack();
  112. cout << "----------------" << endl;
  113. pherofs->JNattack();
  114. pherofs->JNattack();
  115. pherofs->JNattack();
  116. cout << "---------******************-------" << endl;
  117. delete pherozs;
  118. delete pherofs;
  119. _CrtDumpMemoryLeaks();
  120. return 1;
  121. }

四 "模板方法(Template Method)模式"的扩展

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/425144
推荐阅读
  

闽ICP备14008679号