我需要创建一个策略模式,其中用户从二十或三十个唯一策略对象列表中选择四个策略。随着项目的成熟,策略列表将会扩展,用户可以随时更改其选择的策略。这段代码太脆弱了吗?
我打算将他们选择的策略名称存储为字符串,然后使用像这样的方法来加载与他们选择的字符串相对应的策略类。
class StrategyManager { // simplified for the example
public $selectedStrategies = array();
public function __construct($userStrategies) {
$this->selectedStrategies = array(
'first' => new $userStrategies['first'],
'second' => new $userStrategies['second'],
'third' => new $userStrategies['third'],
'fourth' => new $userStrategies['fourth']
);
}
public function do_first() {
$this->selectedStrategies['first']->execute();
}
public function do_second() {
$this->selectedStrategies['second']->execute();
}
public function do_third() {
$this->selectedStrategies['third']->execute();
}
public function do_fourth() {
$this->selectedStrategies['fourth']->execute();
}
}
我试图避免一个大的switch语句。我的担心是,这似乎有点Stringly Typed
。有没有更好的方法来实现这个目标,而不使用条件或大型开关语句?
顺便说一句:用户在选择四种策略时不输入字符串。我需要维护一个字符串列表,以便在选择框中显示给用户,并在添加新策略对象时将新列表添加到列表中。
说明
ircmaxell表示关于它是什么我试图做一些混乱。在上面的例子中,用户从列表中选择了四个策略,并且它们以字符串数组的形式传递给了StrategyManager构造函数。相应的策略对象被创建并存储在内部阵列中,“first”,“second”,“third”和“fourth”是四种不同选定策略的内部阵列的数组键。 StrategyManager对象构建完成后,应用程序会在流程的整个生命周期的各个时刻使用四种策略的execute
方法。
所以,简而言之,每次应用程序需要执行策略编号“one”的方法时,它都这样做,并且结果会根据用户为策略“one”选择的策略而有所不同,
我很困惑。是“第一个”,“第二个”,“第三个”和“第四个”不同的可能策略,或者它们是选定策略的一系列命令(在构建管理器之前选择)。如果是这样,[责任链](http://sourcemaking.com/design_patterns/chain_of_responsibility)或[命令](http://sourcemaking.com/design_patterns/command)模式会更好地工作吗?你能解释一下你究竟在做什么(以及代码的作用,为什么存在不同的策略)? – ircmaxell 2010-10-18 16:47:00
我会更新问题。 – Stephen 2010-10-18 16:48:35
总是有4个策略?他们是否总是按顺序执行?或者,他们是四种不同的策略,你只是试图一起管理? – ircmaxell 2010-10-18 17:02:55