这种分层类结构的合适设计模式是啥?

Posted

技术标签:

【中文标题】这种分层类结构的合适设计模式是啥?【英文标题】:What's an appropriate design pattern for this hierarchical class structure?这种分层类结构的合适设计模式是什么? 【发布时间】:2011-09-23 19:35:53 【问题描述】:

我有一个实例化类层次结构的类。接口应该通过呈现单个类引用来隐藏所有内部层次结构。 (中间级别的类的接口应该以相同的方式隐藏内部实现细节。)我在决定如何将接口参数向下传递到最低级别并将状态更改向上传递到顶层时遇到了一点困难。我想出的东西变得一团糟。

我看到了一些关于黑板模式的讨论,但据我所见,它看起来是临时的和扁平的,而不是分层的。 (虽然平面与分层可能并不重要。)

我的类是一个日历视图,继承了 UIView。层次结构包括一个标题类、一个网格类(多次实例化)、一个平铺类(多次实例化),以及一些辅助类。它基于 Keith Lazuka 在 Objective C 中的 kal 日历。我决定根据我的需要重新组织它,并且想在引入灵活性问题之前重新考虑它的这一部分。

我的问题在标题中。

【问题讨论】:

看看类集群模式。 感谢您的建议。我查看了 Cocoa Design Patterns 中的类集群模式。如果我理解正确,对我来说,它看起来像子类型多态性,其中层次结构较低级别的所有对象都具有取决于数据类型的行为。我看不出这对具有不同行为和滚动的对象层次结构有何帮助,但它们的行为仍然具有功能和参数依赖性。 【参考方案1】:

我认为 KVO(Key Value Observer)设计模式对于将状态信息从低层冒泡到顶层是有意义的。只有需要向上流动的状态信息才能在每个相应的层上被观察到。

在这个应用程序中,一个被点击的瓦片事件被发送到上一层(网格层)的观察者,告诉它用户已经选择了一个日期,这是瓦片类的一个属性。

在网格级别,它会根据当前状态和观察者从图块接收到的新信息来更改其状态。 (在我的日历中,用户可以通过选择开始日期和结束日期来选择日期范围,并且可以继续点击图块来更改他的日期范围选择。)网格级别的更改状态转化为开始和/或结束日期,因此更新了 NSDictionary 属性。

在日历级别,观察者会看到 startDate/endDate 字典的变化。无论这来自哪个网格(有两个网格,一次只有一个处于活动状态。图块和日历不需要知道这一点)日历的开始日期和结束日期都会更新。

日历是植入到应用程序的其他视图之一中的视图,初始化为要显示的月份和选定的日期范围(开始日期和停止日期)。信息通过指向任何层的每个直接子视图的指针从顶部向下流动。这些子视图负责保持其子视图的配置。我已经消除了显式添加委托方法或回调的需要,这简化了从上到下的连接。连接只在层次结构的上层或下层。

这可能看起来并不多,因为它看起来相当简单。但是直到我花了一段时间思考它才清楚。我希望它能给其他人一些关于他们自己的代码的想法。我仍然想知道是否有其他建议可以回答我的问题。

【讨论】:

以上是关于这种分层类结构的合适设计模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

UI自动化项目分层设计思想(po模式)

Web开发的分层结构与MVC模式

java 登陆分层结构设计思想

软件架构模式之分层模式

在通用类的层次结构中使用访问者模式的最佳方法是啥?

软件架构之分层架构理解