【问题标题】:A design pattern concerns设计模式关注点
【发布时间】:2013-12-24 04:27:09
【问题描述】:

我发现了一些非常类似于设计模式的东西。我正在做的是创建一个注入多个类的实例。到目前为止,它是一个 DI,但它的不同之处在于一个实例被馈送到多个依赖类:

var instance = new ClassA();

var dep1 = new DependentFoo(instance);
var dep2 = new DependentBar(instance);

我发现它现在对 2 个示例情况很有用:

  1. 使用多个 GUI 模块制作模块化代码时。我将当前工作数据的一个实例提供给不同的依赖类,例如,当单击“新文件”时,底层数据被清除

  2. 在游戏开发中 - 当有许多不同的游戏模式时 - 每个都需要一个当前的地形实例 - 例如两种模式:道路建设模式和树木放置模式需要具有相同的实例,因为它们将在相同的数据。

我可能会详细说明这一点,但我的问题是:这是一个命名模式吗?我知道 DI 通过将依赖项放入类中来工作。但在我的情况下,它更进一步 - 将该实例用于多个依赖类。

【问题讨论】:

    标签: oop design-patterns


    【解决方案1】:

    这不是一个特定的模式,AFAIK。通过 DI 提供共享资源只是一种方法或技术。 IoC 框架将此称为“生活方式”管理。

    【讨论】:

      【解决方案2】:

      它被称为对象组合,它本身并不是一种“设计模式”,而是一种结构化代码的方式,因此您可以减少重复。坚信您正在做的事情的人会阐述 SOLID 和 DRY 的原则。如果您身处 OO 世界,这些都是好事。 (如果您处于 FP 世界中,它们也是一种很好的哲学,尽管有时不赞成 DI。)

      【讨论】:

      • DI也是一种对象组合,或许我不应该把DI称为设计模式?
      • 顺便说一句:DI 不受欢迎,因为人们试图使用它来做所有事情,或者将单元测试优先于程序核心功能。我也反对——单元测试永远不会解决任何真正的问题。
      • @lukasz1985 单元测试将解决许多实际问题。实际上,单元测试一直在解决实际问题,尤其是那些介于键盘和椅子之间的问题,或者至少证明代码本身不是问题。
      • 现实世界的问题是由核心程序功能解决的问题。剩下的就是你说的程序员了。如果程序员不够聪明,无法弄清楚他做错了什么,也没有完全理解他正在创建的底层系统,那么单元测试将永远不会有足够的帮助。只有当你真正关心它们时,编程才能带来理解现实生活过程的乐趣。测试是好的 - 证明某些东西是有效的。他们无法证明其他任何事情。
      【解决方案3】:

      您可能想查看观察者模式或 MVC 模式,因为这些都是您的目标。

      【讨论】:

      • 您的实例确实类似于模型,但我不太确定它是否是一个完全成熟的模型。对于完整的 MVC,模型通常还可以通过观察者模式实现并与其他人交互,而且我也不太确定您是否拥有完全拆分的视图和控制器。 MVC 是用于编写 UI 的标准设计模式,在游戏中也很常见。我不认为你目前拥有的是 MVC,但我认为你正在走向 MVC。
      【解决方案4】:

      现代 IoC 容器知道如何处理它。

      1. Lifestyles 在温莎城堡
      2. Scope in Ninject
      3. Lifetime Managers 在 Unity 中

      例如温莎城堡有Scoped Lifestyle。它确保解析的实体在范围内是相同的。

      注册:

      Container.Register(Component.For<MyScopedComponent>().LifestyleScoped())
      

      用法:

      using Castle.MicroKernel.Lifestyle;
      
      using (Container.BeginScope()) //extension method
      {
          var one = Container.Resolve<MyScopedComponent>();
          var two = Container.Resolve<MyScopedComponent>();
          Assert.AreSame(one, two);
      
      } // releases the instance
      

      Bound Lifestyle 用于确保解析的实体在特定的根/图中是相同的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-28
        • 2012-06-09
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        相关资源
        最近更新 更多