当我第一次发现策略模式时,我惊讶于它为我和我的程序提供的看似无穷无尽的可能性。我可以更好地封装模型的行为,甚至可以即时交换这种行为。但该策略也可用于为包含对象提供特征和有效负载 - 在超类中声明的数据。生活很美好。
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(); }
};
这两种模式对我来说似乎都非常强大,我喜欢在不同情况下使用这两种模式。但我不确定在某些情况下是否存在特定/典型/更实用的应用程序。
我想知道:你在哪里使用策略和策略?哪个更合适?
答案 0 :(得分:24)
策略主要在编译时设置,而策略在运行时设置。此外,策略通常是C ++概念,并且仅适用于少数其他语言(例如D),而策略模式可用于许多(大多数?)面向对象的语言,以及将函数视为头等公民的语言,如python
话虽如此:
在编译时确定的策略通常仅对需要基于每个二进制的不同应用程序逻辑的特殊情况有用。例如,您可以开发为每个客户稍微定制的软件,无论是通过Web界面还是手工,这都是基于策略的模式。
策略是在运行时确定的,实际上可以动态更改。例如,您可能拥有为salesforce实现与支持组不同的用户界面和逻辑的软件,但是他们都必须处理相同的客户和许可信息,而不是只有两个单独维护的应用程序,您只需要一个应用程序界面根据需要而变化。
- 亚当
答案 1 :(得分:4)
我认为他们是same thing。