反政策战略与战略政策

mst*_*obl 13 c++ design-patterns strategy-pattern

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

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_; };
Run Code Online (Sandbox Code Playgroud)

随之而来的是策略模式,它将允许我更灵活地为一个包含类提供参数 - 整个类,但是我喜欢,虽然动态地交换了行为......但这并不太容易(除非部分策略是有策略!).

class MyMonsterTrait { typedef typename ElveAI AI; };

template< class MonsterTrait >
class Monster : public MonsterTrait::AI
{
    void idle (void) { attack(); }
};
Run Code Online (Sandbox Code Playgroud)

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

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

Ada*_*vis 26

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

话虽如此:

  • 在编译时确定的策略通常仅对您需要基于每个二进制的不同应用程序逻辑的特殊情况有用.例如,您可以开发针对每个客户轻微定制的软件,无论是通过Web界面还是手工,这都是基于策略的模式.

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

-亚当


Bil*_*ard 5

我以为它们是同一件事