是否有设计模式来收集和汇总信息并在最后报告?

时间:2011-01-19 10:53:11

标签: design-patterns

我正在使用具有用户界面的桌面软件。该软件允许用户做某些事情。现在,该软件需要跟踪用户随着时间的推移所做的某些事情。最后,当时机成熟时,该软件应该发布它随时间积累的信息。我想知道在这种情况下哪种设计模式适合。

我曾经使用静态类和静态字符串字段来累积信息的位和片段,最后发送该字符串来报告状态。但我再次处于类似的情况,我认为我可以比在整个代码中调用此静态字段做得更好。

这周围有设计模式吗?

4 个答案:

答案 0 :(得分:3)

期待这里简单的答案(没有模式)。

EventEmitter.emit() 事件,用于您希望在应用中跟踪的每个有趣(在每个有趣的地方)事物(用于任何目的) )。 EventCollector 负责跟踪发出的所有事件。在正确的时间, EventReporter 将根据EventCollector收集和存储的事件生成() 报告。以下是我看到的课程。

EventEmitter

  • emit(事件e)

事件

EventCollector

EventReporter

  • 报告generateReport()

您可以为您的简单用例忽略EventCollector,并且可以使用Java Collection(如果您想保留事件发生的顺序等,则使用List。)

  1. 在您的简单场景中使用静态支架没有任何问题。有时简单的事情对我们程序员来说是可疑的; - )
  2. 事件不再是字符串。他们是自己的抽象。
  3. 单一责任原则:每个班级做一个逻辑事情,可以独立测试
  4. 简单易懂

答案 1 :(得分:1)

如果你不想结合你的课程,那么Singleton就是你的选择。根据您使用的编程语言,您必须以不同的方式实现此模式

据我了解,您希望在应用程序的不同层之间共享信息。如上所述,单身人士会很好。

任何不同的解决方案都会增加你的类的耦合。因此,单身人士模式是要走的路。

编辑:既然你让我思考,为什么我会得到downvotes,我会改变我的答案:使用依赖注入。阅读本文,您就会明白为什么:http://sites.google.com/site/steveyegge2/singleton-considered-stupid(至少我做过)并且还会明白如何做到这一点。

嘿嘿,你刚刚在正确的时间把我带离了辛格尔顿滥用的黑暗道路。

答案 2 :(得分:1)

好的,我会尝试一个。虽然我喜欢@Pangea的回答。有很多模式可以做到这一点。

怎么样:

使用MVC pattern让您的用户更改您的数据。 它的工作原理如下:我是一名用户,通过MVC的V,我操纵了GUI。当GUI中发生事情时,C(控制器)获取信息。主要是通过活动。他是追踪事件而不是其他人的人。然后通过控制器更新M(型号)。因此控制器包含某人可以执行的每个操作。 Controller将以正确的格式将GUI中的信息传递给模型。

此模型知道如何更新自身并将(例如,通过事件)响应视图已更改。 (NotifyObserver())。

当时间到了,您想要发布您的信息。您可以简单地创建另一个视图(这是MVC模式的有趣之处)并以您想要的方式显示信息。因此,GUI将与其余部分完全分开。

这是模式的第一部分。

现在,如果我们想撤消操作并重做(不知道你是否想要那样)。我们可以查看Command pattern。这将允许您通过命令指定用户操作。此命令可以执行和撤消特定操作。这两种模式可以很容易地在一个应用程序中合并。

我希望我的回答足以满足您的需求。我已经准备好了解这两种模式的任何问题!

答案 3 :(得分:1)

你面临的问题是一个常见的问题,但要考虑到这一点,你的问题需要考虑更大。好吧,我解释一下自己。

收集元素,并在某个时刻通过清空集合将它们释放到某个终点是一个可以通过非常简单的方式或通过更精细的解决方案来解决的问题。

你可能使用过这个解决方案(用c#编写):

public class MyClass {
   private static Stack<Object> collection;
   ...
   MyClass() {}
   ...
   public void InsertElement(Object el) {}
   public Object[] RemoveAll() {}
}

这样您就可以轻松地在此类中放置和检索元素。从编程最佳实践的角度来看,它不是一个非常好的解决方案,因为您无法实现可扩展性,灵活性,维护和效率。

可以使用Iterator模式以获得全功能集合(可迭代),并且还可以清空元素并在清除之前返回它们:

public class MyCLass : Iterable { // I do not remember the name of the interface that in C# enables a class to be iterated through the foreach statement
   private Stack<Object> collection;
   ...
   MyClass() {}
   ...
   public Object GetElementAt(unsigned int pos) {}
   public void InsertElement(Object o) {}
   ...
   /* Members implemented from the interface */
   ...
   public Object[] RemoveAll() {}
}

但迭代不是你想要的对象(注意:迭代器是一种模式,但在这种情况下不是你想要的那种)。

可以考虑基于事件的方法。您可以看到,使用回调模式可以定义一个事件,该事件在被触发时会释放您的集合并返回所有元素。

public class MyCLass {
   ...
   ... event ...
   ...
   MyCLass() {}
   ...
   public Object[] RemoveAll() {}
}

定义一个指向函数的指针(在c#中为一个委托)并在其上定义一个事件,当你的应用程序需要释放集合时,引发事件并在事件触发时自动调用正确的释放函数。

嗯,在你的情况下,我会说的很简单。请更改方法,因为在您的课程中使用静态元素是不正确的。静态元素是能够在所有类中持久化的元素,并保证所有实例化类将相同的值视为一种共享内存,或更好的类状态!在你的情况下,只需保留一个元素集合并在一个简单的类中处理它,我在这里向你展示:

public class CollectionManagerWrapper {
   private Stack<Element> elements; /* Element is the type you are interested in */
   public String Size {
      get { return this.elements.Size(); }
   }
   CollectionManagerWrapper() {
      this.elements = new Stack<Elements>();
   }
   // Methods
   public Element[] getAll() {
      Element[] els = this.elements.ToArray();
      this.elements.Clear();
      return els;
   }
}

正如你所看到的那样,没有使用特殊的模式,因为我觉得这样做太过分了......我向你们报告了一些可能的模式的例子,因为我不确定你是否想要一个强大的应用程序或只是解决问题的解决方案,而不考虑可扩展性,灵活性等。