15

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

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(); }
};

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

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

4

2 回答 2

27

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

话虽如此:

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

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

-亚当

于 2008-10-23T20:34:43.600 回答
5

我以为它们是一样的

于 2008-10-23T20:24:15.900 回答