父类调用它的几个子类是否有一个通用的设计模式


Is there a common design pattern for a parent class calling several of its child classes

例如,我有几个不同的商户客户,我为他们处理交易。他们希望有不同的衡量标准来确定欺诈行为,其中许多是常见的。我想要一些东西,大意是:

class Fraud
{
}
class InvalidCheckFraud extends Fraud
{
}
class NotAMemberFRaud extends Fraud
{
}
class CustomerLooksFunnyFraud extends Fraud
{
}

等等……

我只希望能够运行0到许多扩展的欺诈类使用命令,如:

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

我不介意用一种完全自主的方式来解决这个问题,但是如果已经有人解决了,我想走那条路。

我在PHP编码,但我很好与使用任何其他语言的参考。

看起来你在寻找类似策略模式的东西。

你应该为你的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);

你的Fraud类应该叫做FraudChecker或者类似的东西,并且有一个可以检查的Fraud子类的列表,或者实现一些接口的类。然后循环遍历每个检查项。