当我第一次发现策略模式时,我惊讶于它为我和我的程序提供的看似无穷无尽的可能性.我可以更好地封装模型的行为,甚至可以即时交换这种行为.但该策略也可用于为包含对象提供特征和有效负载 - 在超类中声明的数据.生活很美好.
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)
这两种模式对我来说似乎都非常强大,我喜欢在不同情况下使用这两种模式.但我不确定在某些情况下是否存在特定/典型/更实用的应用程序.
我想知道:你在哪里使用战略和政策?哪个更适合?