观察者/通知与代表

时间:2015-04-13 18:36:12

标签: design-patterns delegates notifications observer-pattern

我们说我有以下应用程序:

enter image description here

在这个应用程序中,我有一个带有两个按钮的菜单,一个带我到帖子屏幕,另一个带我到Liked帖子屏幕。

在两个视图中以完全相同的方式呈现的实际帖子,不同之处在于其中一个帖子中的所有帖子都会选择相似的按钮(喜欢帖子scree)而另一个帖子会有类似按钮的帖子未选中(帖子屏幕)。

如果我在帖子屏幕中,例如,我单击一个帖子的like按钮,PostView将向PostController报告点击了它的按钮,PostController将使用Server类更改该帖子的状态,然后PostController将更新PostView的类似按钮被选中或取消选择(与之前的状态相反)。

现在,如果我点击“赞”按钮更改“帖子”屏幕中的帖子状态,则应在两个位置,“帖子”屏幕和“喜欢的帖子”屏幕中更新类似按钮视图。 我可以想到两种方法:

1)PostController报告(通过委托)到PostsController它的状态被改变,PostsController报告(通过委托)到MenuController,MenuController告诉LikedPostsController一些帖子的状态被改变了, LikedPostsController告诉它的PostController告诉它的PostView更新like按钮(如果它被更改为选中)或从LikedPostsController的视图中删除帖子(如果它被更改为未选中)。

2)使服务器的所有PostControllers观察者成为可能,然后服务器可以在每次更改某些帖子的状态时发送通知。

哪一个更好,为什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果服务器同时拥有两个列表:帖子,喜欢的帖子,那么让服务器通知感兴趣的观察者会更有意义。在基本级别喜欢/取消链接帖子应该像帖子列表刷新一样处理。这简化了应用程序的设计,因为对两个列表中的任何一个感兴趣的组件可以订阅该列表(观察它),并且还提供组件之间的分离。虽然我必须说我不太喜欢调用这个组件Sever,因为服务器组件应该只发出服务器API请求。

另一种方法强制您添加和维护多个委派级别,还会将组件耦合在一起,因为根控制器需要知道需要更新多少个控制器。如果另一个列表发挥作用(例如书签帖子),您将需要相应地更新您的控制器,这可能是单调乏味且容易出错。