包含其他对象集的对象的设计模式

时间:2015-05-20 18:03:22

标签: design-patterns

我有Hero,Castle,Artefact和Position等类的复杂结构。他们有以下关系:

  • 一个位置可以包含几个或没有英雄,而一个英雄只能打开 一个职位。
  • 城堡属于一个英雄,可以在一个位置上建造。一个英雄 可以有0-1城堡。一个位置也可以有0-1个Castes。
  • 人工制品既可以埋在一个位置,也可以装备一个 英雄。因此,Artefact参考0-1英雄和0-1位置。一个 英雄可以有0-1个人工制品,一个位置可以包含0-1个人工制品 同样。

现在,要实现这些双向关系,很难总是更改所有受影响对象中的引用(例如,当Hero装备Artefact时,我必须更改Hero.Artefact,Artefact.Hero,Artefact.Position和Position.Artefact)。因此,我正在使用一个Game类,它作为所有这些的容器(换句话说,Game类有4个列表,每个类一个)。

然后,我将引用添加到包含游戏中,并且在ID的帮助下,我能够更加优雅地更改单个引用(再次装备Artefact):

Artefact.HeroID = newHeroID;
Artefact.PositionID = null;

然后,各个类中的所有访问器都允许我获取正确的对象:

Hero.Artefact
{
    get
    {
        return this.Game.Artefacts.FirstOrDefault(a => a.HeroID == this.ID);
    }
}

Artefact.Hero
{
    get
    {
        return this.Game.Heroes.FirstOrDefault(h => h.ID == this.HeroID);
    }
}

这个设计模式是否有名称(它是一种设计模式)?当你知道实现时,很难找到正确的答案,但不知道名字:D(反过来说很简单)。

1 个答案:

答案 0 :(得分:0)

对我来说,它看起来像是Domain Driven Design的存储库模式,在这种情况下是内存实现。

存储库是一个神奇的架子,您可以从中获取域对象(例如您的Hero,Artefact)。如何完成它与存储库的客户端无关,你可以传递MySQL实现,文件,redis等。在你的情况下,它是一个简单的内存存储。

更多信息:http://martinfowler.com/eaaCatalog/repository.html