首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含其他对象集的对象的设计模式

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

Stack Overflow用户
提问于 2015-05-20 18:03:21
回答 2查看 104关注 0票数 0

我有一个复杂的结构,包括英雄,城堡,艺术品和位置。他们的关系如下:

  • 一个位置可以包含几个英雄或没有英雄,而一个英雄只能在一个位置上。
  • 城堡属于一个英雄,可以建在一个位置上。英雄可以有0-1的城堡.一个位置也可以有0-1种姓。
  • 一件艺术品既可以埋在一个位置,也可以由一个英雄装备。因此,人造物是指0-1英雄和0-1位置.英雄可以有0-1手工艺品,一个位置也可以包含0-1手工艺品.

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

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

代码语言:javascript
复制
Artefact.HeroID = newHeroID;
Artefact.PositionID = null;

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

代码语言:javascript
复制
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 (反过来非常简单),就很难找到正确的答案。

EN

回答 2

Stack Overflow用户

发布于 2015-05-21 11:44:01

对我来说,它看起来像是域驱动设计中的存储库模式,在这种情况下是内存实现。

存储库是一个神奇的架子,你可以从那里得到你的域对象(比如你的英雄,艺术品)。它的实现方式与存储库的客户端无关,您可以在那里传递MySQL实现、文件、redis等等。在您的示例中,它是一个简单的内存存储。

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

票数 0
EN

Stack Overflow用户

发布于 2022-02-06 11:54:17

没有一种设计模式可以解决您的业务问题。这些模式只是文档化的、鼓励重用的实现方法。我建议您阅读一下https://dofactory.com/net/design-patterns,这可能是最易读和最简洁的教程。它可能会给你一些洞察和指导你的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30357185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档