对不起有点误导性的标题,但我不太清楚如何更好地问这个。
我有一个目录,其中的类执行相同的工作但具有不同的实现。他们都看起来像这样:
class someClass {
private static $variable=12345;
public static function someTask($keyword){
...
return array();
}
private function pf() {...}
}
这些方法采用相同的参数,并返回相同结构的数组。
我想创建一个类,以便能够从该文件夹(也许每个文件夹)中调用选定的类来组合它们的结果,按照某些条件对结束返回进行排序。
我想到了策略模式,但据我所知,它就像:
$obj = new Context();
$obj->setStrategy(new ConcreteStrategy1);
$obj->getStrategy()->task(); // => „Strategy 1”
$obj->setStrategy(new ConcreteStrategy2);
$obj->getStrategy()->task(); // => „Strategy 2”
每次我想调用另一个类时,我都必须手动更改它。这将使我在一些类(策略)名称上使用foreach。这是正确的方法吗?另外,请帮助我找到更好的标题,因为那个问题具有误导性。
答案 0 :(得分:1)
策略模式它只是我们提取并放入某种方法的算法。然后我们将我们需要的算法传递给上下文并在那里使用它。
如果你想让一个班级处理不同的策略并结合他们的结果,我认为Visitor pattern会更好。
答案 1 :(得分:0)
我想出了一个有效的解决方案
class SearchEngine {
public $instances=array();
public function __construct() {
$inputSites = $this->importClasses(); //import all classes in directory
foreach ($inputSites as $site) {
$classname = 'API\\' . $site . "Api";
$startegyInstance = new $classname();
array_push($this->instances,$startegyInstance);
}
}
public function searchByTitle($keyword) {
$results = array();
for ($i=0; $i<sizeof($this->instances); $i++){
//this searchByTitle is not recursion
$next = $this->instances[$i]->searchByTitle($keyword);
$results=array_merge($results,$next);
}
return $results;
}
private function importClasses($classesToImport){
foreach ($classesToImport as $class) {
$imp="API/".$class."Api.php";
require_once ($imp);
}
}
}
(我削减了不太重要的细节) 在classes目录中,我有接口和类。 此解决方案有效。我没有足够的经验来判断它是最佳的还是好的。