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

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

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

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

最佳答案

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

话虽如此:

  • 在编译时确定的策略通常仅对希望在每个二进制基础上使用不同应用程序逻辑的特殊情况有用。例如,您可以开发针对每个客户略微定制的软件,无论是通过Web界面还是手工创建,这都是基于策略的模式。
  • 一种策略是在运行时确定的,实际上可以随时更改。例如,您可能拥有与支持团队不同的软件来为Salesforce实现不同的用户界面和逻辑,但是他们都必须处理相同的客户和许可信息,因此不必拥有两个单独维护的应用程序,而只需拥有一个应用程序即可界面根据需要进行更改。

  • -亚当

    10-06 12:44