设计/实现两个(或者多个)与同一对象具有"具有"关系的类的正确方法是什么?

时间:2020-03-06 14:22:09  来源:igfitidea点击:

假设我有一个这样的设计:

对象GUI有两个对象:对象aManager和对象bManager,它们彼此之间不会对话。

aManager和bManager都具有对象cManager作为属性(或者更确切地说是指向cManager的指针)。因此,当aManager修改其cManager时,也会同时影响bManager的cManager。

我的问题是设计/实现此方法的正确方法是什么?

我当时正在考虑将cManager用作GUI的属性,并且在构造aManager和bManager时GUI会传递一个指向cManager的指针。但是恕我直言,GUI与cManager无关,那么GUI为什么应该将其作为属性?

我在这里应该使用一种特定的设计模式吗?

解决方案

我们可以根据需要使用Factory模式来请求aManager和bManager对cManager的引用。

http://msdn.microsoft.com/en-us/library/ms954600.aspx

我们应该考虑将GUI与模型和实现分开。

如果只打算在整个应用程序范围内只有一个cManager,则可以使cManager单身。

如果不讨论我们要实现的目标,就很难回答。但是,我要说的就是让GUI像我们所说的那样将指针传递给aManager和bManager。

如果我们要创建GUI并想知道如何获取和获取数据,那么我可以推荐以下方法:
http://codebetter.com/blogs/jeremy.miller/archive/2007/07/25/the-build-your-own-cab-series-table-of-contents.aspx

我认为这主要是为Cuser编写的,但将适用于其他语言。我猜这可能比我们第一个OO应用程序所需的要先进。我认为我们将不得不为自己准备一本有关OO设计的书,并花一些晚上来学习。

作为一个菜鸟,我建议我们不要在第一时间尝试以最完美的正确方式来做所有事情,而只是想一些工作即可。随着时间的推移(我们会学到很多东西),我们将学到什么使解决方案比其他针对不同标准的解决方案更好。问题没有正确的答案。

如果我们不回答问题,我将尽可能简单地解释一下,对不起。

当我们真正获得此问题的答案时,这是真正思考面向对象的第一步。

在OO中,当两个对象都"具有"另一个对象时,两个对象都引用该另一个对象是完全可以接受的。 OO的诀窍是对象具有自己的生命,它们是可变的,任何需要它们的人都可以保留对其的引用。当被许多其他对象使用时,该对象必须保持自身"有效"并保持稳定性。 (这就是为什么像String这样的不可变对象如此之大,它们始终与创建它们的第二个对象一样有效的原因)

一个例外是如果我们使用C ++进行编码,因为我们实际上必须手动释放对象,这意味着拥有者可以监视每个对象的生命周期,这使得在C ++中的OO中"思考"真的非常困难。

[添加]由于我们是指指针,因此我认为我们正在使用C ++进行编程,这是不同的。在这种情况下,我们是对的。使一位经理"拥有"共享对象的生命周期。在所有其他引用都消失之前,它一定不要让该对象死亡。

我们也可以使用参考计数。每当有人获得对我们对象的引用时,它都会调用" addReference"或者其他名称,一旦完成,它将删除该引用。如果任何人在计数为1时调用removeReference,则对象可以自行清理。这可能与我们在C ++中实现真正的OO样式分配/释放一样近。但是,这非常容易出错。

我相信有图书馆可以做这种事情。

我建议仅在GUI对象构造函数中将cManager作为参数传递,但不要维护对其的引用(此处为Java代码,但我们可以理解):

public GUI(CManager cManager)
{
    this.aManager = new AManager(cManager);
    this.bManager = new BManager(cManager);
    // don't bother keeping cManager as a field
}

我认为在这里不适合使用Singleton或者Factory。

谨慎使用单例(如果要进行简单测试,则根本不使用!)

  • 单身人士是病态的骗子
  • 所有单身人士都去了哪里
  • 单身人士的根本原因