“经纪定义集”设计模式——众所周知的另一个名字?

2023-12-02

在我参与多年的一个项目中,我逐渐形成了一种设计模式,事实证明它对我来说非常有用。有时我觉得我应该对此有点福音派,但如果我尝试并发现这只是我对某人旧帽子的版本,我会有点尴尬。我翻遍了设计模式,徒劳地寻找它,而且我还没有遇到其他人谈论它,但我的搜索并不详尽。

核心思想是拥有一个管理一组定义对象的代理对象,每个定义对象构成一些复杂属性的可能值。例如,您可能有 Car、Plane 和 Generator 类,它们都具有 EngineType。 Car 不存储自己的 EngineType 对象,它存储某种类型的引用键,用于说明其拥有的 Engine 类型(例如整数或字符串 ID)。当我们想要查看 EngineType(例如 WankelEngine)的属性或行为时,我们向 EngineTypeBroker 单例对象询问 WankelEngine 的定义对象,并向其传递引用键。该对象封装了有关 EngineTypes 的所有有趣的内容,可能只是一个属性列表,但也可能加载了行为。

因此,它促进的是一种共享的、松散耦合的聚合,其中许多汽车可能有一个 WankelEngine,但只有一个 WankelEngine 定义对象(并且 EngineTypeBroker 可以替换该对象,利用松散耦合来增强运行时态射)。

我使用此模式的一些元素(继续使用 EngineType 作为示例):

  1. 总是有 IsEngineType(x) 和 EngineType(x) 函数,分别用于确定给定值是否是 EngineType 的有效引用键以及检索与引用键对应的 EngineType 定义对象。
  2. 我总是允许给定 EngineType 使用多种形式的引用键,总是至少有一个字符串名称和定义对象本身,通常是一个整数 ID,有时是聚合 EngineType 的对象类型。这有助于调试,使代码更加灵活,并且在我的特定情况下,缓解了与旧实践相关的许多向后兼容性问题。 (在这个项目的上下文中,人们用来执行所有这些操作的常用方法是为 EngineType 可能具有的每个属性定义哈希值,并通过引用键查找属性。)
  3. 通常,每个定义实例都是该定义类型的通用类的子类(即 WankelEngine 继承 EngineType)。定义对象的类文件保存在 /Def/EngineType 等目录中(即 WankelEngine 的类将是 /Def/EngineType/WankelEngine)。因此,相关的定义被分组在一起,类文件类似于 EngineType 的配置文件,但具有定义代码的能力(通常在配置文件中找不到)。

一些简单的示例伪代码:

class Car {

    attribute Name;
    attribute EngineTypeCode;

    object GetEngineTypeDef() {
        return EngineTypeBroker->EngineType(this->GetEngineTypeCode());
    }

    string GetDescription() {
        object def = this->GetEngineTypeDef();
        return "I am a car called " . this->GetName() . ", whose " .
            def->GetEngineTypeName() . " engine can run at " .
            def->GetEngineTypeMaxRPM() . " RPM!";
    }

}

那么,这有一个名字吗?


单例注册中心

信不信由你。今天早上我也在想同样的事情。

我以前使用过这种模式,但我从未找到它的参考,也不知道如何命名它。

我认为这是一种“键控”单例,其中实例存储在某处,并使用密钥获取它们。

我上次使用它是从不同来源检索数据。

我有大约 50 个数据库表(使其成为 10 个),并且我有一个前端“表”,其中要显示数据,但数据可以来自任何这些源,并且每个源都需要不同的逻辑(查询、联接、键) , ETC。 )

该前端是“可配置的”,因此我不知道要显示哪些值以及哪些值不会显示。

解决方案是将columnName(在前端)作为键,并获取正确的实例来创建正确的查询。

它一开始就安装在哈希图中,后来从数据库表中检索。

代码是这样的:

class DataFetcher {
    abstract Object getData( Object id );
}

class CustomerNameDataFetcher extends DataFetcher {
    Object getData( Object customerId ) { 
        // select name from customer where id = ? 
     }
}

class CompanyAdressDataFetcher extends DataFetcher { 
     Object getData( Object customerId ) { // don't ask why.
          // select name from company , customer where customer.co = company.co and cu = ?  etc.
     }
} 

class ProductColor extends DataFetcher { 
     Object getData( Object x ) { 
     // join from customer to color, to company to season to a bunch of table where id = ? 
}

// And the list goes on.

每个子类使用不同的逻辑。

在运行时,用户配置其视图,并选择他想要查看的内容。

当用户选择要查看的列时,我使用列名称和 Id 来获取数据。

DataFetcher 全部安装在父类中(我不想为此有一个单独的类)的类方法中。

class DataFetcher {
    abstract Object getData( Object id );

    private static final Map fetchers = new HashMap();static { 
        fetchers.put("customer.name", new CustomerNameDataFetcher() );
        fetchers.put("company.address", new CompanyAdressDataFetcher () );
        fetchers.put("product.color", new ProductColor () );
        ...
    }
    public static DataFetcher getFetcher( String id ) { 
        return fetchers.get( id );
    }      

}

最后填充前端表我只是这样称呼它:

伪代码

 for each row in table 
      for each column in row
          column.text = DataFetcher.getFetcher( column.id ).getData( row.id )
       end
 end

是这样吗?或者我误读了你的描述,我的描述完全不同。

最后我认为这被称为 SingletonRegistry 或类似的东西。我(可能)喜欢你,出于需要而创造了这个。这很可能是一种常见模式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“经纪定义集”设计模式——众所周知的另一个名字? 的相关文章

  • 初始化单例的不同方式

    在 C 和 Java 中 我基本上看到了每个人初始化单例的一种方法 static obj inst null obj getInstance if inst null inst new obj return inst 现在 当我转向 iPh
  • 异步编程设计模式

    我正在为 CF NET 开发一个小型技术框架 我的问题是 我应该如何编写异步部分的代码 在 MSDN 上阅读了很多内容 但我不太清楚 所以 这是代码 public class A public IAsyncResult BeginExecu
  • 如何在 Kotlin 中的数据类上实现空对象模式?

    我有一个 Kotlin 数据类 data class PaymentAccount val accountId Int val accountNumber String val title String 这就是我在 Java 中要做的事情
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • 在事件聚合器中混合枚举与事件类

    我最近尝试实现自己的简单事件聚合器 我从 MSDN 上的事件聚合器文章中获得了很多灵感 关于 MSDN 上的事件聚合器 我注意到一件事是事件实际上是它们自己的类 这根本不是一件坏事 然而 我只是觉得总是为每个小事件创建一个新的空类很尴尬 我
  • 在 Spring Singleton 中创建新实例会导致内存泄漏吗?

    我目前正在维护一个应用程序 并注意到许多在 Spring 接线中定义为 Singleton 的对象在其方法中创建了其他对象的新实例 例如 有一个 LoginService Singleton 每次调用 login 方法时都会创建 Login
  • CLSIDFromProgID 成功但 CreateInstace 失败!为什么?

    我正在尝试创建 COM 对象的实例 我有实现该接口的类名 并使用 CLSIDFromProgID 获取 CLSID 因此 自从我获得 CLSID 以来 我想从现在开始一切都会好起来的 但是 当我调用 CreateInstance 并传入 C
  • 为什么默认构造函数在静态构造函数之前执行?

    我想知道为什么我的静态构造函数会输出default constructor Static Constructor 而不是相反Static Constructor and Default constructor要不就Default const
  • 关于存储库的领域驱动设计问题

    我正在尝试实现 DDD 因此我创建了以下类 用户 域模型 UserRepository 管理对象的中央工厂 UserMapper UserDbTable 映射应用程序功能并提供 CRUD 实现的映射器 我的第一个问题是 当模型需要与持久层通
  • RegAsm regfile 开关没有提供与代码库开关相同的输出

    好吧 我知道这是非常具体的 但我为此浪费了整个工作日 所以我真的需要一些合理的解释 这样我的老板和我的妻子就不会解雇我 根据 MSDN The regfile开关 为程序集生成指定的 reg 文件 The codebase开关 在注册表中创
  • 如何在 C# 中找到已安装应用程序的升级代码?

    我正在使用 Windows Installer API 的 C 包装器WIX 工具集 http wixtoolset org 我用ProductInstallation类来获取有关已安装产品的信息 例如产品代码和产品名称 例如 产品名称 我
  • 在 PHP 中扩展单例

    我正在使用一个 Web 应用程序框架 其中一部分由许多服务组成 所有服务均以单例形式实现 它们都扩展了一个 Service 类 其中实现了单例行为 如下所示 class Service protected static instance p
  • 对注册表项“全局”的访问被拒绝

    在向 defaultAppPool 用户授予权限时 我收到消息 没有这样的全局用户或组 DefaultAppPool 有人能帮我一下吗 但是 使用命令 net localgroup Performance Monitor Users Def
  • 策略、访问者和模板方法模式之间有什么区别?

    我在课堂上刚刚学习了这些设计模式 但是我看不出它们之间有什么区别 它们听起来是一样的 都是在抽象类之上创建具体类 有人可以帮我打消这个疑虑吗 谢谢 访问者 策略和模板模式都包含算法的应用 最大的区别在于它们是如何被唤起以及如何在实践中使用的
  • F#:模式构成?

    我正在尝试编写一个由另外两个模式组成的模式 但我不确定如何去做 我的输入是字符串列表 文档 我有一个与文档标题匹配的模式和一个与文档正文匹配的模式 该模式应该匹配整个文档并返回标题和正文模式的结果 您可以使用以下命令一起运行两个模式 您在问
  • 这种设计模式在 JavaScript/jQuery 中被称为什么?

    我正在查看 JavaScript 源代码光滑网格 https github com mleibman SlickGrid 我注意到 slick grid js 具有以下结构 function Slick Grid extend true w
  • @Inject 和 @PostConstruct 不适用于单例模式

    我有一堂课如下 public class UserAuthenticator private static UserAuthenticator authenticator Inject private UserRepository user
  • 将状态上下文作为附加方法参数嵌入到状态中有何优缺点?

    在设计模式的背景下state 嵌入的优点和缺点是什么StateContext作为附加方法参数State 为了更清楚地说明 public void handle Object obj vs public void handle StateCo
  • AngularJS 中的非单例服务

    AngularJS 在其文档中明确指出服务是单例 AngularJS services are singletons 违反直觉的是 module factory还返回一个 Singleton 实例 鉴于非单例服务有很多用例 实现工厂方法以返
  • 单例可以促进遗留代码库中的单元测试。好主意好不好?

    各位 我有一个庞大的遗留 Net 代码库 并且我正在尝试向团队引入单元测试 他们是好人 但这对他们来说是全新的 老实说 这对我来说也是相当新的 问题之一是代码库大量使用 System IO 中的静态类 有大量的内部静态类库 并且类不会写入接

随机推荐