从目录

时间:2017-01-04 22:48:36

标签: php design-patterns

对不起有点误导性的标题,但我不太清楚如何更好地问这个。

我有一个目录,其中的类执行相同的工作但具有不同的实现。他们都看起来像这样:

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。这是正确的方法吗?另外,请帮助我找到更好的标题,因为那个问题具有误导性。

2 个答案:

答案 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目录中,我有接口和类。 此解决方案有效。我没有足够的经验来判断它是最佳的还是好的。