我正在尝试使用装饰器设计模式实现slickgrid。我从包含slickgrid对象的coregrid开始,并具有所有其他装饰器将实现的所有“公共”函数。为了说明我会给你一个例子。 coregrid传递给AddRecordDecorator并由其添加,AddRecordDecorator将添加记录功能添加到网格中。然后将网格传递给FilterDecorator并由FilterDecorator包装,以添加过滤器功能。然后,该网格将传递给FindAndReplaceDecorator并由其添加,该FindAndReplaceDecorator将添加查找和替换功能,并且是最终的包装器。这一切都发生在GridFactory中,看起来像这样。
function getMyGrid(type,htmlId,tableMetaData){
var grid = getCoreGrid(type,htmlId,tableMetaData);
grid = new AddRecordDecorator(grid);
grid = new FilterDecorator(grid);
grid = new FindAndReplaceDecorator(grid);
return grid;
}
这很有效,因为现在我可以使用GridFactory制作不同类型的网格,这些网格只有我需要的功能,并且我可以在一个页面上有多个网格,因为它们都有唯一的ID。
现在我想让一些装饰者互相沟通。
问题是没有任何装饰器彼此了解,也无法为其他装饰器调用方法。 FilterDecorator不知道AddRecordDecorator,因此如果您对网格进行了过滤,然后向该网格添加记录,则数据不会被重新过滤。因为FilterDecorator不知道发生了添加事件。所以我不知怎的,我需要这两个人互相交谈。
我正在考虑使用任何装饰器可以写入的消息传递队列类,并且任何装饰器都可以侦听。这样,当AddRecord进行更改时,它可以告诉正在侦听消息传递队列的装饰器是否已进行更改。
我的另一个选择是让装饰器在coregrid中注册,coregrid知道添加了哪些装饰器,并且可以直接向这些函数发送调用。
我在质疑这些选项是否会破坏装饰器设计模式,如果是这样,还有其他方法可以实现这一点吗?我想坚持这个模式,但这是我第一次使用它,我不想创建一个会导致问题的黑客攻击。
提前感谢您的帮助。