gpt4 book ai didi

c# - 什么设计模式?

转载 作者:太空狗 更新时间:2023-10-30 00:47:19 24 4
gpt4 key购买 nike

我有一个类 A 维护一个对象列表类 B。但是 B 类的每个对象都可以在 A 类的任何对象中引用。B 类还维护一个引用它的 A 类对象的列表。该程序可以并且将“随意”创建(多个)A 类和 B 类对象,也可以删除它们。

如果我使用 C#,我可以使用以下代码从两个类中添加和删除对象

public class A
{
private List<B>ListOfObjects_B;
public bool Add(B Object)
{
bool bAdd = false;
if ((Object != null) && (ListOfObjects_B.IndexOf(B) <0))
{
ListOfObjects_B.Add(Object);
Object.Add(this);
bAdded = true;
}
return bAdded;
}

public bool Delete(B Object)
{
bool bDeleted = ListOfObjects_B.Remove(Object);
if (bDeleted == true) Object.Delete(this);
return bDeleted;
}
}

public class B
{
private List<A>ListOfObjects_A;
public bool Add(A Object)
{
bool bAdd = false;
if ((Object != null) && (ListOfObjects_A.IndexOf(A) <0))
{
ListOfObjects_A.Add(Object);
Object.Add(this);
bAdded = true;
}
return bAdded;
}

public bool Delete(A Object)
{
bool bDeleted = ListOfObjects_A.Remove(Object);
if (bDeleted == true) Object.Delete(this);
return bDeleted;
}
}

这将起作用,因为第二次(通过递归)将对象删除/添加到 ListOfObjects 将调用该函数,它将无法删除/添加,从而避免无限循环。

但我不喜欢这段代码,即使 A 和 B 对另一个类了解不多,只是调用删除/添加函数。

我想这种问题很普遍,并且存在一种设计模式来处理它,从而可以避免递归并且更新两个列表将“更好”。我应该使用什么设计模式?如果也添加一些代码,我将不胜感激。

最佳答案

您可以通过将“对象关联关注点”移动到专用类中来简化事情。这就是我的想法。

定义一个名为 AssociationTable 的类。此类将维护一个对列表,其中每个对都包含对 A 对象的引用和对 B 对象的引用。

每个 A 对象(和每个 B 对象)都将持有对 AssociationTable 对象的引用。A.Add(B) 将实现为 table.add(this, b);B.Add(A) 将实现为 table.add(a, this);

删除将实现为 table.delete(this, b) 或 table.delete(a, this)

class Pair { 
A a; B b;
Pair(A a, B b) { this.a = a; this.b = b; }
// Also override Equals(), HashCode()
}

class AssociationTalbe {
Set<Pair> pairs = ...;

void add(A a, B b) { pairs.add(new Pair(a, b)); }
void remove(A a, B b) { pairs.remove(new Pair(a, b)); }
}

class A {
AssociationTable table;

public A(AssociationTable t) { table = t; }

void add(B b) { table.add(this, b); }
void remove(B b) { table.remove(this, b); }
}

编辑:这种设计的问题是垃圾收集。该表将保存对对象的引用,从而抑制它们的集合。在 Java 中,您可以使用 Wea​​kReference 对象来解决这个问题。我很确定 .Net 世界中有类似的东西

此外,该表可以是单例。我不太喜欢单例。在这里,单例将使 A-B 关联在您的程序中独一无二。这可能是不受欢迎的,但这取决于您的具体需求。

最后,(只是把事情放在上下文中)这个设计的工作方式与关系数据库中的多对多关系相同。

关于c# - 什么设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1016959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com