我正在开发一个应用程序,该应用程序的模块按顺序执行以下财务操作:
当用户要求将一定金额转入她的银行帐户时:
- 检查现在是否可以进行任何交易?(交易只能在特定时间段内进行)
- 检查用户是否已要求提取最低金额
- 检查用户是否具有任何默认帐户
以上所有操作的结果均应记录。
如果满足以上所有条件,则执行交易。将来可能还会有其他检查。
哪种面向对象设计模式最适合上述情况?
我正在开发一个应用程序,该应用程序的模块按顺序执行以下财务操作:
当用户要求将一定金额转入她的银行帐户时:
以上所有操作的结果均应记录。
如果满足以上所有条件,则执行交易。将来可能还会有其他检查。
哪种面向对象设计模式最适合上述情况?
Answers:
听起来您正在寻找的是责任链。在这种情况下,您可以拥有以下课程:
TransactionValidatorBase
抽象基类TransactionTimeValidator
TransactionAmountValidator
TransactionAccountValidator
它们链接在一起以应用您指定的许多规则。
读进一步
如果您的步骤序列主要执行验证职责(看起来像您一样),而又不改变输入内容,那么我认为确实是“责任链”模式,如@pswg在他的回答中所述
但是,由于您的问题有点笼统,因此我也想添加“管道处理”,因为有了这一点,一个步骤将产生一个输出,该输出将成为下一步的输入(因此将原始输入变异) 。
这是关于它的两篇文章:
Martin Fowler的管道收集
关于该模式的更多理论讨论
正确的模式实际上取决于上下文。在选择要遵循的任何特定模式之前,我将尝试找出这些问题的答案:
基于直觉,我会将它们编码为带有错误代码聚集参数的简单方法。
public void DoTransaction(IErrorAgregator error, TransactionRequest request)
{
if(!IsTransactionInCertainTimePeriod(request, error)) return;
if(!IsTransactionAmountInUserBounds(request, error)) return;
if(!UserHaveDefaultAccount(request, error)) return;
bankingTransactor.PerformTransaction(request);
}
最好将DoTransaction放入“ ITransactionValidationStragegy”接口,并创建一个包含验证样板代码的超类型层。
但是,在这种设计中,我假设验证逻辑是在编译时确定的。
根据我的理解,所需的任何内容都可以安装到以下命令模式中。可以按照以下步骤进行课程设计。
interface Transaction{
void performAction();
}
class Banking{
void moneyValidation(){
//Validate Here
}
void timeValidation(){
//validate Here
}
}
class TimeValidation implements Transaction{
public Banking bank;
public TimeValidation (Banking bnk){
bank=bnk;
}
void performAction(){
bnk.timeValidation();
}
class MoneyValidation Implements Transaction{
public Banking bank;
public MoneyValidation(Banking bnk;){
bank=bnk;
}
void performAction(){
bnk.moneyValidation();
}
}
class Control{
private List val_list=new ArrayList();
void storeValidation(Transaction trans){
val_list.add(trans);
trans.performAction(val_list.getFirstAndRemove());
}
}
//Same for other validation classes
您的Client类将包含以下代码片段:
Banking bnk = new Banking();
MoneyValidation m_val = new MoneyValidation (bnk);
TimeValidation t_val = new TimeValidation (bnk);
Control ctrl = new Control();
ctrl.storeValidation(m_val);
ctrl.storeValidation(t_val);
根据我的理解,这是上面给出的方案。