【问题标题】:Decorator or Chain of responsibility装饰者或责任链
【发布时间】:2021-07-21 22:52:54
【问题描述】:

我的应用程序有一个计划的(每周)任务来填充对象的不同属性。此应用程序将是多租户,这意味着对于每个租户,应用程序可能必须填充不同的/子集属性。为了满足这个要求,我想为我的预定工作选择正确的设计模式。目前正在积极考虑两种设计模式。

  1. 装饰器
  2. 责任链

我可以发现这些模式之间的主要区别在于,在前者中,对象会通过管道中的每个类,而在后者中,管道中只有一个类会作用于对象。

对于装饰器,我将为每个属性创建单独的类,而对于责任链,我将为每个租户创建单独的类。我的理解正确吗?

ps :: 如果我的理解是正确的,我更喜欢Decorator。

【问题讨论】:

  • 装饰器听起来不正确。我会在这里使用策略模式。每个作业都是一个对象,每个作业对象都有一个完成该作业的策略。 Strategy 是一个单独的对象,其中包含每个作业的详细信息。如果您可以将每个任务分解为任何租户都可能使用的离散操作,则每个作业可能有多种策略。
  • 责任链在我看来也是错误的。根据我的《四人帮》一书,CoR 是“避免将请求的发送者与接收者耦合,通过给多个对象提供更改来处理请求”。这听起来更像是一种管道类型的操作,每个作业都可能被其他对象操作。但是对于这种模式,你分解它的方式似乎是错误的。然而,我投票结束基于意见。

标签: java design-patterns decorator chain-of-responsibility


【解决方案1】:

我同意Strategy Pattern 的@markspace 评论 对于您描述的问题,似乎是一个很好的解决方案。

解决方案的关键是 “流程如何识别租户”。 一旦解决了这个问题,租户将推动所使用的策略。

【讨论】:

    【解决方案2】:

    如果我正确理解了这个问题,那么在这两者中,责任链听起来最合适。

    我想像这样的 API:

    public interface IPopulator
    {
        void Populate(Foo foo);
    }
    

    然后您可以为每个租户制定一个实现,例如

    public class Tenant1Populator : IPopulator
    {
        private readonly IPopulator next;
    
        public Tenant1Populator(IPopulator next)
        {
            this.next = next;
        }
    
        public void Populate(Foo foo)
        {
            if (!IsTenant1(foo))
            {
                next.Populate(foo);
                return;
            }
    
            // Else, populate foo here...
        }
    }
    

    其他实现将遵循类似的模板。

    不过,给这只猫剥皮的方法不止一种。另一种选择是让每个“处理程序”在内部检测它是否要对对象做某事,然后使用复合模式要求所有组合对象做他们的事情。

    FWIW,OP 中的绘图看起来很适合我。装饰器模式将使您能够让每个类完成部分工作。如果这更可取,那也可以。

    这实际上取决于您希望更改最多的代码部分。

    【讨论】:

      猜你喜欢
      • 2019-05-11
      • 1970-01-01
      • 2011-04-12
      • 2017-06-11
      • 2010-10-19
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-08
      相关资源
      最近更新 更多