选择正确的模式来使用“驱动程序”并将其组合起来

时间:2012-01-29 20:08:36

标签: php design-patterns

我是设计模式的新手。我已经在我使用的框架上使用它,但现在我需要为我想做的事情选择合适的框架。我的问题是下一个:

我有两个数据库需要提取统计信息。我将称之为 lorem ipsum 。在某些情况下,我只需要来自一个,另一个或两个组合的数据。其实我的功能如下:

  • GETALL
  • getAllFromLorem
  • getAllFromLipsum

我认为我可以使用 factory 模式执行以下操作:

<?php
$lorem = Stats::factory('lorem');
$lorem->getAll();

$lipsum = Stats::factory('lipsum');
$lipsum->getAll();

我对这种结构的看法将是:

/stats/lorem.php
/stats/lipsum.php
/stats.php

当我生产一个或其他驱动程序时,它将使用另一个文件的getAll。

我认为这是对的。但我也有问题。我想要有内部组合它的功能,例如:

<?php
$all = Stats::factory();
$all->getAll(); // this is lorem and ipsum combined (by me, not auto of course...)

但最后这件事我不知道如何实现它。这个getAll函数会去哪里?

有人能建议我这样做的好方法吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我们的想法是让您的Stats::factory()方法返回特定接口的对象。在这种情况下,界面将类似于:

interface StatsSource {
    function getAll ();
}

您将有一个实现“单个数据库”版本,另一个实现组合结果的组合源版本。这是一个简单的实现,它只是将结果从两个源合并在一起。

class SingleDBStatsSource implements StatsSource {

    function __construct ($database) {
        // $database would be the name of the db to use
        // or better yet, a connection to the specific db.
    }

    function getAll ()
    {
        // use databse connection to retrieve all records.
    }        

}


class CombinedStatsSource implements StatsSource {

    function __construct ($statsSourceList) {
        $this->statsSourceList = $statsSourceList;
    }

    function getAll ()
    {
        $results = array();
        foreach ($this->statsSourceList as $statsSource) {
            $results = array_merge($results, $statsSource->getAll());
        }
        return $results;
    }        

}