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