Выбор правильного шаблона, чтобы использовать «драйверы» и объединить его - PullRequest
0 голосов
/ 30 января 2012

Я новичок в дизайне шаблонов. Я использовал его в рамках, которые я использовал, но теперь мне нужно выбрать правильный для того, что я хочу сделать. Моя проблема заключается в следующем:

У меня есть две базы данных, где мне нужно извлечь статистику. Я буду называть это lorem и ipsum . В некоторых случаях мне нужны только данные из одного, из другого или двух вместе взятых. На самом деле у меня есть такие функции, как:

  • GETALL
  • getAllFromLorem
  • getAllFromLipsum

Я думаю, что могу использовать фабричный шаблон для того, чтобы сделать что-то вроде этого:

<?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 голосов
/ 30 января 2012

Идея в том, чтобы ваш 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;
    }        

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...