设计模式之策略模式(C++)

简介: 设计模式之策略模式(C++)

一、策略模式是什么?

      策略模式是一种行为型的软件设计模式,针对某个行为,在不同的应用场景下,有不同的实现算法,并且可以互相替换。比如两军交战,军队会采用不同的阵法、策略、兵法应对不同的战况。


      策略模式的优点:


  1. 便于管理算法族。一套策略对应一套算法,该模式可以很好地进行维护和管理。
  2. 避免使用多重条件语句,如if else和switch。庞大的系统中,过多的多重条件语句会让代码显得臃肿和不易维护,提高出错概率。
  3. 封装算法。提高了算法的保密性和安全性。
  4. 符合开闭原则。

     策略模式的缺点:


  1. 客户端需要了解每种策略,并自行决定何时何地使用何种策略。
  2. 随着策略增多,策略类数量增加,要注意对类的维护。

二、策略模式

2.1 结构图

      客户端即Main主函数,根据不同场景选用不同策略。

2.2 代码示例

      场景描述:我有一支军队,先让其使用火攻震慑对方,再用离间策反敌人。

//Strategy.h
/****************************************************/
#pragma once
#include <iostream>
#include <unordered_map>
#include <vector>
#include <list>
using namespace std;
// 策略类型
enum WARCRAFT_TYPE
{
  FIREATTACK,                    // 火攻
  SOWDISCORD,            // 离间
};
// 定义策略接口-兵法
class Warcraft 
{
public:
  // 执行
  virtual void execute() = 0;
};
// 实现具体策略类-火攻
class FireAttack : public Warcraft 
{
public:
  // 执行
  virtual void execute() {
    cout << "执行'火攻'!" << endl;
  }
};
// 实现具体策略类-离间
class SowDiscord : public Warcraft 
{
public:
  // 执行
  virtual void execute() {
    cout << "执行'离间'!" << endl;
  }
};
// 背景类-军队
class Army 
{
public:
  // 构造函数
  Army(WARCRAFT_TYPE type){
    setWarcraft(type);
  }
  // 析构函数
  ~Army() {
    if(m_warcraft) {
      delete m_warcraft;
      m_warcraft = nullptr;
    }
  }
  // 设置策略
  void setWarcraft(WARCRAFT_TYPE type) {
    // 清空旧策略
    if (m_warcraft) {
      delete m_warcraft;
      m_warcraft = nullptr;
    }
    // 使用新策略
    switch (type)
    {
    case FIREATTACK:
      m_warcraft = new FireAttack();
      break;
    case SOWDISCORD:
      m_warcraft = new SowDiscord();
      break;
    default:
      cout << "没有该策略。" << endl;
      break;
    }
  }
  // 执行兵法
  void executeWarcraft() {
    cout << "准备!" << endl;
    m_warcraft->execute();
    cout << "结束!" << endl;
  }
private:
  Warcraft* m_warcraft;
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Strategy.h"
using namespace std;
int main()
{
  Army *army = new Army(FIREATTACK);
  army->executeWarcraft();
  army->setWarcraft(SOWDISCORD);
  army->executeWarcraft();
  delete army;
  army = nullptr;
  return 0;
}

    程序结果如下。

      策略模式的实现有很多种,我是采用了枚举的形式,将具体策略的创建放在了环境类中,类中new别忘了delete;也可以在客户端创建策略,再将策略指针传入环境类。

三、总结

      我尽可能用较通俗的话语和直观的代码例程,来表述我对策略模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解策略模式。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
27天前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
45 4
|
3月前
|
设计模式 算法 测试技术
PHP中的设计模式:策略模式的应用与实践
在软件开发的浩瀚海洋中,设计模式如同灯塔,指引着开发者们避开重复造轮子的暗礁,驶向高效、可维护的代码彼岸。今天,我们将聚焦于PHP领域中的一种重要设计模式——策略模式,探讨其原理、应用及最佳实践,揭示如何通过策略模式赋予PHP应用灵活多变的业务逻辑处理能力,让代码之美在策略的变换中熠熠生辉。
|
18天前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
36 1
|
22天前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
26 2
|
1月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
43 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文通过游泳运动员的案例,介绍策略模式及其在Kotlin中的改良应用,利用高阶函数简化代码结构,提高灵活性。
35 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
本教程详细讲解Kotlin语法,适合深入学习。快速入门可参考“简洁”系列教程。本文介绍策略模式在Kotlin中的应用,通过游泳运动员的例子,展示如何使用接口和高阶函数实现策略模式,使代码更简洁、灵活。
31 2
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
64 3
|
2月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
28 3
|
2月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
33 1

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    59
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    47
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    54
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    65
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    43
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    70
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    62
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    43
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    52
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    121