例如,我有几个不同的商户客户,我为他们处理交易。他们希望有不同的衡量标准来确定欺诈行为,其中许多是常见的。我想要一些东西,大意是:
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子类的列表,或者实现一些接口的类。然后循环遍历每个检查项。