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

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_; };

随着政策模式的出现,它允许我在向包含类提供参数时具有更大的灵活性 - 整个类,按照我喜欢的方式进行配置,尽管动态地交换行为......这不太容易(除非政策的一部分是制定策略!)。

class MyMonsterTrait { typedef typename ElveAI AI; };

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

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

我想知道:您在哪里使用策略和政策?哪里更适合?

有帮助吗?

解决方案

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

话虽如此:

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

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

-亚当

其他提示

我认为他们是同样的事情

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top