代码之家  ›  专栏  ›  技术社区  ›  Emerion

设计模式:选择哪一种?

  •  6
  • Emerion  · 技术社区  · 14 年前

    然后我有一个“收藏类”B,它有一个a的列表。

    现在我要做的是:,

    文件夹发生了变化,A检测到这一点并向B发送一条消息,B将此消息传输到类C。然后类C开始更新GUI的方法。(进行了哪些更改等…)

    现在我已经在这个问题上找了很久,想了很久,但是找不到解决办法。但是,我发现了两种设计模式:

    调解人和观察员。

    作为一名软件工程师,我在某种程度上曾经制作过观察者模式,因此我知道那里的一些基础知识。

    • 在这种情况下最好使用什么模式?

    • 如何使B将消息传送给C?

    • 我是否需要自定义事件/委托来将数据传输到B,还是可以使用内置事件?

    注:我正在使用C语言作为我的编程语言。

    5 回复  |  直到 14 年前
        1
  •  4
  •   Rob Vermeulen    14 年前

    我从中了解到,有一堆“a”对象异步地将事件传递给单个B,而B又将信息传递给单个C。

    那么,让B包含并观察A,让C观察B。

    旁注 :不要 你的软件。试着豁达一点,总是找到最简单、最容易的解决办法。只在适当的地方使用模式,而不是仅仅因为它是可能的。我见过很多人把代理、命令模式、观察者、MVC、中介等扔进去,这些都是不必要的。

        2
  •  5
  •   Péter Török    14 年前

    观察员很好。您可以使C成为B的观察者(这样B就可以将事件从A传输到C),或者使C直接侦听A(这可能是更糟糕的选择,因为它创建了从C到A的直接依赖关系)。

    注意,这基本上是 Model-View-Controller ,其中A是模型,C是视图。现在B是否会成为一个合适的控制器很大程度上取决于它的职责:如果它只是a的集合,那么让它成为控制器不是一个好主意。如果没有更多关于你的课程和职责的细节,很难说得更多。

        3
  •  3
  •   Master Morality    14 年前
    public class A
    {
        public event FileSystemEventHandler FileSystemEvent;
    
        A()
        {
            this.fsw = new FileSystemWatcher();
            this.fsw.OnFileSystemEvent += (sender, e) => 
                { if(this.FileSystemEvent != null) 
                     this.FileSystemEvent(this,e); };
        }
    }
    
    public class B
    {
        public event FileSystemEventHandler FileSystemEvent;
    
        B()
        {
            this.RegisterAClasses();
            foreach( A item in this.AClasses )
                 item.FileSystemEvent += (sender, e) =>
                     { if(this.FileSystemEvent != null) 
                          this.FileSystemEvent(sender, e) };
        }
    }
    
    public class C
    {
        C()
        {
            this.RegisterBClass();
            this.BClass.FileSystemEvent += (sender, e) => 
                 { /* update gui... */ };
        }
    }
    

    (psuedo代码…)

        4
  •  1
  •   Scott Weinstein    14 年前

    最后,我使用了几乎相同的场景演示了反应式扩展。

    详细信息和源代码- http://code.msdn.microsoft.com/RxDemos

        5
  •  0
  •   coolkid    14 年前

    观察者是一个合适的模式。我不明白你为什么这么说:

    然后我有一个“收藏班”B

    因为,对于观察者模式,我认为B应该观察A,所以在类A中,有一些B用于监听A触发的事件(A文件夹被更改)。类似地,类C应该观察B,因此在类B中有一些对象C寄存器用于监听B触发的事件。 自定义事件或内置事件的必要条件取决于您的类。如果它的.NET是类,我认为有一些事件可以通知目录中的更改。如果没有,您应该编写自己的事件/委托。