c++ - 战略与政策的对立和政策与战略的对立

标签 c++ design-patterns strategy-pattern

当我第一次发现策略模式时,我对它为我和我的程序提供的看似无穷无尽的可能性感到惊讶。我可以更好地封装模型的行为,甚至可以即时交换这种行为。但该策略也可用于为包含对象提供特征和有效负载 - 在父类(super class)中声明的数据。生活很好。

class MyMonsterAI   { float const see_radius_; virtual void attack () = 0; /* .. */ };
class ElveAI        { ElveAI() : see_radius_(150.0f) {} /* ... */ };
class CycloneAI     { CycloneAI() : see_radius_(50.0f) {} /* ... */ };
class Monster       { MyMonsterAI* ai_; };

随之而来的是 Policy 模式,它可以让我更加灵活地为包含类提供参数 - 整个类,按照我喜欢的方式装备,尽管动态交换行为......这不太容易(除非部分政策是要有战略!)。

class MyMonsterTrait { typedef typename ElveAI AI; };

template< class MonsterTrait >
class Monster : public MonsterTrait::AI
{
    void idle (void) { attack(); }
};

这两种模式对我来说似乎都非常强大,我喜欢在不同的情况下同时使用这两种模式。但我不确定在某些情况下是否有特定/典型/更实用的应用程序。

我想知道:您在哪里使用策略以及在哪里使用策略?哪一个更适合?

最佳答案

策略主要是在编译时设置的,而策略是在运行时设置的。此外,策略通常是 C++ 概念,仅适用于少数其他语言(例如 D),而策略模式适用于许多(大多数?)面向对象语言,以及将函数视为一等公民的语言,如 python .

话虽如此:

  • 在编译时确定的策略通常仅适用于您需要基于每个二进制文件的不同应用程序逻辑的特殊情况。例如,您可能会开发为每个客户稍微定制的软件,无论是通过 Web 界面还是手动,这将是一种基于策略的模式。

  • 策略是在运行时确定的,实际上可以随时更改。例如,您可能拥有为销售人员实现与支持组不同的用户界面和逻辑的软件,但它们都必须处理相同的客户和许可信息,因此您只需拥有一个应用程序,而不是拥有两个单独维护的应用程序根据需要更改界面。

-亚当

关于c++ - 战略与政策的对立和政策与战略的对立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/231318/

相关文章:

c++ - 问题读取文件

c++ -++i 与 i++ : is there any difference on any modern compiler?

c++ - 当我将 int 数据成员的初始化值更改为 1 以外的任何值时程序崩溃

c# - 策略模式电影条件从主类内部到客户端代码,那么有什么意义呢?

策略模式的 UML 类图

c++ - 等待任务在线程池中完成

未知原因的 C++ 编译崩溃 - MythTV 补丁

php - 设计/架构问题 : rollbacks with remote services

c# - 这个图案叫什么?软锁?

javascript - 将案例切换为策略模式