在一个项目,我已经参与多年来,我已经逐渐演变的一个设计图案,证明是非常有用的我。有时候我觉得我应该得到一些福音派有它,但我可一点不好意思如果我尝试并且发现,这只是我的版本,有人旧帽子。我已经挖过 设计图案 寻找它徒劳的,我还没有遇到任何人都谈论它,但我的搜索没有详尽无遗的。

核心思想是具有一个经纪人,对象,管理一组的定义对象,每个定义的对象构成一个可能值的一些复杂的财产。作为一个例子,你可能具有的汽车、飞机和发电机的类都有一个EngineType.车不存储其自己的EngineType目的,它存储的一个参考关键的某些种类的国家的那种发动机,它已(如整数或串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!";
    }

}

因此,有一个名字了吗?

有帮助吗?

解决方案

SingletonRegistry

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

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

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

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

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

这个前端是“可配置的”。所以我不知道要显示哪些值以及哪些不会显示。

解决方案是将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来获取数据。

在类方法中,DataFetchers都安装在父类中(我不想为此设置一个separeate类)。

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或类似的东西。我(可能)喜欢你,出于必要而创造了这个。机会是这是一种常见的模式。

其他提示

之前我使用过类似的模式,最常用的是游戏。我有一个WeaponDefinition和WeaponInstance类(不完全是那些名字)。 WeaponDefinition类(以及各种子类,如果我有不同类型的武器,例如近战与射弹)将负责跟踪该类型武器的全球数据(射速,最大弹药,名称等),并具有所有的逻辑。 WeaponInstance类(和子类)包含触发序列中的当前状态(用于比较激发速率),当前弹药计数和指针(它可能是您的示例中的一个管理类的关键,但是对于WeaponDefinition来说,这似乎不是模式的要求。 WeaponInstance有一堆用于触发,重新加载等的函数,它们只调用WeaponDefinition实例上的相应方法,并将自身作为参数传递。这意味着WeaponDefinition的东西不会为游戏世界中的每个坦克/士兵/飞机重复,但它们都有自己的弹药计数等。

我不知道它叫什么,我不确定它与你所谈论的完全相同,但我认为它很接近。这绝对有用。

听起来像GoF Builder,Prototype和对我来说可能是羽量级的组合。

听起来像是各种各样的Flyweight(许多汽车共享一个WankelEngine)。但这有什么意义呢?大多数汽车都有发动机,但是它们中的许多汽车如何拥有相同的发动机实例?他们不会那么远。或者你是说很多车都有WankelEngine型发动机?更有意义的是。那么“WankelEngine定义对象”的用途是什么?它是一个工厂,正在构建该对象的味道并将它们传递给请求者?如果是这样,它听起来不像一个定义对象,听起来更像是一个工厂,它正在接受要构建的对象的参数并将该对象返回。

我确实在这里看到了一些很好的GoF练习,特别是你正在编写而不是继承(我的Car有一个Engine而我的Car的引擎是一个WankelEngine)。我希望我能完全回忆起这句话,但它类似于“继承打破封装”。和“赞成组合而不是继承”。

我很好奇这个问题解决了什么。我认为你增加了很多复杂性,我没有看到这种复杂性的需要。也许这是我不懂的语言特有的东西。

GoF的人确实讨论将模式组合成更大的模式,MVC尤其是三种其他模式的集合。听起来你已经做过类似的事情了。

听起来有点像服务定位器,其中你的羽量重量被注册为单身人士。

你有什么是一张地图,又名词典。你只有一个独特的转折,它通过具有多键地图的一个对象。

为什么它的一个地图:

  • 保持一个关键
  • 使用的关键要查询一个值从一些数据结构。

你可以找到实现:

  • STL(包括:地图上)
  • Java(进口:java。工具.词典)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top