Существует ли общий шаблон проектирования для родительского класса, вызывающего несколько его дочерних классов - PullRequest
3 голосов
/ 08 ноября 2011

Например, у меня есть несколько разных торговых клиентов, для которых я обрабатываю транзакции. Им нужны разные показатели для определения мошенничества, многие из которых распространены. Я хотел бы иметь что-то с эффектом:

class Fraud
{

}

class InvalidCheckFraud extends Fraud
{

}

class NotAMemberFRaud extends Fraud
{

}

class CustomerLooksFunnyFraud extends Fraud
{

}

и т.д ...

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

$fraudCheck = new Fraud();
$fraudCheck->checkMerchant($merchId);

Я не против решить эту проблему полностью доморощенным способом, но если это уже выяснилось, я бы хотел пойти по этому пути.

Я пишу на PHP, но справляюсь со ссылкой на любой другой язык.

Ответы [ 2 ]

3 голосов
/ 08 ноября 2011

Похоже, вы ищете что-то вроде паттерна стратегии .

Вы должны определить интерфейс для ваших Fraud классов, которые принимают $merchId:

interface Fraud {
    public function check($merchId);
}

Затем реализуйте каждый подкласс:

class InvalidCheckFraud implements Fraud {
    public function check($merchId) {
        // do something and return
        return true;
    }
}

class NotAMemberFraud implements Fraud
{
    public function check($merchId) {
        // do something and return
        return false;
    }
}

Затем создайте класс контекста, который проверяет каждый из них:

class FraudContext implements Fraud {
    protected $_frauds = array();    

    public function addFraud(Fraud $fraud) {
        $this->_frauds[] = $fraud;
    }

    public function check($merchId) {
        foreach ($this->_frauds as $fraud) {
            if (!$fraud->check($merchId)) {
                throw new LogicException(
                  "{$merchId} has failed the check for ".get_class($fraud)
                );
            }
        }
        return true;
    }
}

$merchId = 42;
$context = new FraudContext;
$context->addFraud(new InvalidCheckFraud);
$context->addFraud(new NotAMemberFRaud);
$context->check($merchId);
0 голосов
/ 08 ноября 2011

Ваш класс Fraud должен называться FraudChecker или чем-то подобным и иметь список подклассов Fraud, которые он может проверять, или классы, реализующие некоторый интерфейс. Затем вы просто зацикливаетесь на каждом чеке.

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