2012-02-16 44 views
1

我要寻找一个合适的设计模式如下:实现一个子系统通信设计模式

我有以下的体系结构:

MainApplication 
    SubSystem1 
    SubSystem2 
    SubSystem3 

凡MainApplication初始化各子系统,

SubSystem1 s1; 
    SubSystem2 s2; 
    SubSystem3 s3; 

    public MainApplication() 
    { 
     s1 = new SubSystem1(); 
     s2 = new SubSystem2(); 
     s3 = new SubSystem3(); 
    } 

和每个子系统应该能够相互通信。

在每个子系统中,我如何从另一个子系统调用方法?例如在s1

public SubSystem1() 
    { 
     s2.Method1(); 
     s3.Method2(); 
    } 

门面设计模式会在这里工作吗?如果是这样,它将如何实施?如果没有这种设计模式应该用于这种情况?

+0

沟通的延伸是什么?它是基于事件的本质还是子系统1确实是x,因此子系统2也需要y? – 2012-02-16 21:08:30

+0

目前,它是后者。尽管使用事件听起来像一个很好的解决方案。你可以扩展这个吗? – 2012-02-16 21:10:56

+0

那么,如果这将是基于事件的基础,如哦音乐来自电线。您可以使用事件(内置.net)订阅事件,并根据需要为每个子系统处理。这将阻止子系统必须彼此了解。 – 2012-02-16 21:20:08

回答

2

这很大程度上取决于子系统之间的通信类型。

如果它是抽象的,即子系统实际上不必知道彼此,基于发布 - 订阅的消息机制可能是合适的。有关引言,请参阅https://en.wikipedia.org/wiki/Publish/subscribe,但我认为该概念应该相当简单。

另一方面,如果子系统真的必须以具体的方式彼此认识,为什么他们的子系统是第一位的?进行这种划分表明确实存在关注的分离,因此找到一个抽象接口应该不那么难。如果是这样,也许你应该重新考虑你的子系统的责任。

0

我永远不会记得设计模式名称。为什么你不能让每个子系统知道其他子系统?

s1.SetSubsystem2(s2); 
s1.SetSubsystem3(s3); 
... 

如果你想更未来的变化弹性,描述每个子系统的接口在interface,并确保SetSubsystemX采用该接口,而不是具体类。

编辑:一个接口的例子。

假设您的第一个子系统知道如何发送电子邮件,第二个子系统知道如何打印文件。你应该申报两个接口:

interface IEmailSubsystem 
{ 
    void SendEmail(string content); 
} 

interface IPrintSubsystem 
{ 
    void PrintFile(string path); 
} 

然后,你可以定义你的两个子系统对象:

class Subsystem1: IEmailSubsystem ... 
class Subsystem2: IPrintSubsystem ... 

如果你打算最终需要比3个子系统多,你应该有一个全球性的子系统注册表,但现在不用担心。

+0

因此,从'MainApplication'我们会发送子系统对象到每个子系统?有趣。我有兴趣使用你提到的界面,你可以扩展你的答案来展示一个例子吗?谢谢。 – 2012-02-16 21:05:30

+0

如果这是一个好的解决方案,那么添加和删除接口子系统的列表会更好,然后保存子系统的n个变量。 – 2012-02-16 21:06:24