我目前正在学习设计模式,我遇到了策略模式。我理解它,但现在我想知道在运行时更改策略的最佳解决方案是什么。使用ENV变量是一个好的解决方案吗?示例:
interface Logger{
public function log();
}
class SomeOtherLogger implements Logger {
public function log(){
echo "Logging to something else";
}
}
class FileLogger implements Logger {
public function log(){
echo "Logging to file";
}
}
class Main{
public function doSomething(Loggers $logger){
$logger->log();
}
}
$main = new main();
$main->doSomething(new FileLogger);
我想到的一件事是使用环境变量,但我不确定什么是最好的方法,这对我来说似乎不正确。
$loggingStrategy = env('LOGGING_TYPE') . 'Logger';
$main = new main();
$main->doSomething(new $loggingStrategy);
2条答案
按热度按时间lg40wkob1#
如果你使用Laravel,我有一个更好的解决方案。我希望它对你有用:
Laravel有一个
Manager
基类,你可以用它来实现策略模式。考虑到我们想要伟大的用户取决于他们的语言。首先,让我们实现我们的语言类:
对于德语:
现在我们创建一个
Welcome
类来扩展LaravelManager
基类:现在你可以使用strategy pattern为你的
Welcome
类定义一个default driver。如果你想在运行时改变驱动程序,你可以在welcome
类上使用driver
方法:虽然这样,你也可以使用Laravel
IOC container
。但是如果你想更方便,可以将此模式与LaravelFacade
功能结合起来。例如,在我们的示例中,您应该只将Facades
前缀添加到欢迎类use
关键字。最后的代码应该是这样的:4si2a6ki2#
StrategyController.php
排序策略. php
SortingStrategyContext.php
BubbleSortStrategy.php
快速排序策略. php