Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 是否有一种设计模式来收集和聚合信息并在最后报告?_Design Patterns - Fatal编程技术网

Design patterns 是否有一种设计模式来收集和聚合信息并在最后报告?

Design patterns 是否有一种设计模式来收集和聚合信息并在最后报告?,design-patterns,Design Patterns,我正在开发一个带有用户界面的桌面软件。软件允许用户做某些事情。现在,这个软件需要跟踪用户随着时间的推移所做的某些事情。最后,当时机成熟时,这个软件应该发布它随时间积累的信息。我想知道什么样的设计模式适合这个场景 我曾经使用一个静态类和一个静态字符串字段来积累信息的比特和片段,最后将该字符串发送到状态报告。但是我又遇到了类似的情况,我认为我可以做得比在整个代码中调用这个静态字段更好 是否有一种设计模式围绕这一点?如果你不想把你的类组合在一起,单身是最好的选择。根据您使用的编程语言,您必须以不同的方

我正在开发一个带有用户界面的桌面软件。软件允许用户做某些事情。现在,这个软件需要跟踪用户随着时间的推移所做的某些事情。最后,当时机成熟时,这个软件应该发布它随时间积累的信息。我想知道什么样的设计模式适合这个场景

我曾经使用一个静态类和一个静态字符串字段来积累信息的比特和片段,最后将该字符串发送到状态报告。但是我又遇到了类似的情况,我认为我可以做得比在整个代码中调用这个静态字段更好

是否有一种设计模式围绕这一点?

如果你不想把你的类组合在一起,单身是最好的选择。根据您使用的编程语言,您必须以不同的方式实现此模式

据我所知,您希望在应用程序的不同层之间共享信息。如上所述的单身汉就可以了

任何不同的解决方案都会大大增加类的耦合。因此,单例模式是一条可行之路

编辑:既然你让我思考,为什么我会被否决,我将我的答案改为:使用依赖注入。读了这篇文章,你就会明白为什么:(至少我是这么做的)并且也会得到如何做的提示

嘿,那么,你正好在合适的时候让我走出了单身滥用的黑暗之路。

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

您将EventEmitter.emit()。EventCollector负责跟踪所有发出的事件。在适当的时间,EventReporter将根据EventCollector收集和存储的事件生成一份报告。下面是我看到的课程

事件发射器

  • 发射(事件e)
事件

事件收集器

事件报告员

  • 报表生成器报表()
对于您的简单用例,您可以忽略EventCollector,也可以使用Java集合(如果您想保留事件发生的顺序,请列出)

  • 在您的简单场景中使用静态保持架并没有什么错。有时简单的事情在我们程序员看来是可疑的;-)
  • 事件不再是字符串。它们本身就是抽象的
  • 单一责任原则:每个类做一件符合逻辑的事情,并且可以独立测试
  • 简单易懂

  • 好的,我试试看。虽然我喜欢@Pangea的答案。有很多模式可以做到这一点

    那么:

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

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

    当时间到了,你想发布你的信息。您只需创建另一个视图(这是MVC模式的有趣之处)并以您想要的方式显示信息。因此,GUI将与其他GUI完全分离

    这是模式的第一部分

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


    我希望我的回答足以满足你的需要。我已经准备好回答任何关于这两种模式的问题了

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

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

    您可能使用了此解决方案(用c#书写):

    定义指向函数的指针(在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;
       }
    }
    
    公共类CollectionManagerRapper{
    私有堆栈元素;/*元素是您感兴趣的类型*/
    公共字符串大小{
    get{返回this.elements.Size();}
    }
    CollectionManagerRapper(){
    this.elements=新堆栈();
    }
    //方法
    公共元素[]getAll(){
    Element[]els=this.elements.ToArray();
    this.elements.Clear();
    返回els;
    }
    }
    
    正如你们所看到的,并没有使用特殊的模式,因为我认为这样做太过分了。。。我向您报告了一些可能模式的示例,因为我不知道如何使用c
    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() {}
    }
    
    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;
       }
    }