策略或命令模式?

e36*_*6M3 3 .net c# java architecture design-patterns

假设我有一个金融交易清单,我需要针对这些交易执行验证规则列表.一个例子是我有一个交易来购买产品,但首先我需要验证交易中的帐户是否有足够的可用资金,产品没有售罄等.由于这些许多规则,交易将是标记为已拒绝,以及应指定错误代码.

当然,我正在考虑使用接口来构建我的规则,允许执行代码遍历执行每个规则的规则,直到第一个拒绝事务.

每个规则都需要配置参数(例如,ValidateMinimumBalance需要知道minimumBalance = 30).执行规则的结果可以像设置事务对象上的拒绝代码和错误代码一样简单; 或者它可以像自动修改事务的多个其他属性一样复杂.

我对设计模式的基本理解指向了策略或命令模式,但我不完全确定哪一个更适合这种情况.

命令模式

  1. 每个命令都将实现某种IValidate接口
  2. 该命令的构造函数将事务的实例作为接收者,以便能够读取/验证事务以及修改事务的各个方面.构造函数还将获取一组键/值对作为验证逻辑的参数.

当我试图描绘战略模式如何适合这种情况时,它看起来非常相似.在大多数示例中,策略是使用单个方法的简单对象,但在我的情况下,策略将需要对事务以及验证参数的引用.

Nix*_*Nix 8

策略更习惯于交换算法,它并不真正用于链接验证.如果您打算使用每种类型进行一次验证的模式,那么您可以使用该策略,如果您发现必须使用多个验证器,或者需要重用验证器.我认为你要么找到一种新方法(也就是COR),要么在你的策略中使用COR.


我实际上会回答其他问题.我认为责任模式复合模式的组合验证器的装饰器更适合您的需求.

现在打印一个示例实现..但是在高级别

责任链 设计将围绕以下内容:

abstract class Handler
 {
   protected Handler next;

   public Handler(Handler h){
      this.next = h;
   }
   public abstract bool Validate(Request request); 
   public abstract void Handle(Request request);
}

class CoreLogic: Handler
{   
   public CoreLogic(Handler handle) : base(handle){

   }
   public override void Validate(Request request){
         return True
   }
   public override void Handle(Request request){
        if(this.Validate(request)){
            if(next!= null){
              next.Handle(request);
           }
        }

   }
}

class ValidBalance: Handler
{   
   public ValidBalance(Handler handle) : base(handle){

   }
   public override void Validate(Request request){
        return True
   }
   public override void Handle(Request request){
        if(this.Validate(request)){
            if(next!= null){
              next.Handle(request);
           }
        }

    }
}

class MainApp
{
   static void Main(){
       Handler h = new ValidateBalance( new CoreLogic(null));
       h.Handle(new Request());

   }
}
Run Code Online (Sandbox Code Playgroud)

其他有用的链接:

责任链维基百科