gpt4 book ai didi

c# - 重定向依赖的设计模式

转载 作者:行者123 更新时间:2023-11-30 18:01:53 24 4
gpt4 key购买 nike

下面的类图是我正在处理的一个项目的简化版本。

Class Diagram

类 A 负责序列化/反序列化以 C 为根的对象图。我正在使用 Csharp 的序列化框架,因此当我反序列化类 C 时,该框架会创建一个新的所有以 C 为根的对象实例(在图表中由*新类显示)。现在我想用 Cnew 替换 A 的 C 实例,但问题是 B1 和 B2 仍然指向旧的 D1 和 D2。如果不必重新初始化 B2 和 B2 的依赖项就好了。

我正在寻找一种方法,让 B1 和 B2 能够通过 A 访问 D1 和 D2,而无需让他们访问 C 或相互访问。为了简单起见,我们可以假设 A 的所有成员都必须是公开的(它实现了我正在使用的框架中的一个接口(interface),强制许多成员公开)。

以下是我想到的一些可能的解决方案:

  1. 硬着头皮重新初始化B1和B2

  2. 为 B1 和 B2 提供对 A 的引用,而不是对 D1 和 D2 的引用,并忽略这样一个事实,即这使他们可以访问许多他们不需要访问的类。

  3. 不是让 B 类直接访问 D 类,而是让 A 为返回 A 的 D1 和 D2 实例的函数传递委托(delegate)(函数指针)。

  4. 有一个实现接口(interface),如 D1Container 和 D2Container,它们有 1 个必需的方法,该方法将实例返回到 D1 或 D2。然后将A转换到D1Container或D2Container,传给B1和B2。

这种事情是否有设计模式,或者我的解决方案显然是最好的?

谢谢!

最佳答案

您希望在您的设计中引入另一个间接级别:本质上,而不是存储对 D1 的引用和 D2您正在寻找存储可以让您获得最新信息的东西 D1D2 .你的#3(委托(delegate))选项对我来说是最优雅的,因为你不需要引入新的类来实现延迟评估。您只需要一个 Func<D>A传递给 B - 没有新的类、接口(interface)或委托(delegate);一切都保持很好的封装。

class A {
private B myB;
private C myC;
public A() {
myC = new C();
myB = new B(() => myC.MyD);
}
}
class B {
private readonly Func<D> getD;
public B(Func<D> getD) {this.getD = getD;}
public D { get { return getD(); } }
}
class C {
public D MyD {get; private set;}
}

现在如果A更改其 C , 或 C更改其 D , B.D将继续返回正确的 D自动地。这是因为在引擎盖下,B持有对 A 的引用,但它并不知道它确实如此。

关于c# - 重定向依赖的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8609319/

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