Xor*_*rty 30 design-patterns vaadin
我目前正在研究三种Vaadin应用程序,我真的觉得我想念一些东西.我之前曾经使用过Spring MVC,在这种情况下,体系结构清晰且分离,您可以向控制器注入服务,而不会将控制器耦合到UI等等.
现在在Vaadin那是不同的故事.所以,如果那里有任何Vaadin专家,请允许我问你几个问题:
问题1:
问题2:
问题3:
在我的代码转向Spaghetti之前,我想尽可能多地了解Vaadin的优秀设计,因此任何建议,经验和最佳实践都将受到赞赏.
Dus*_*y J 15
我们使用MVVM模式(又名Fowler的PresentationModel)运气很好.他的文档有点陈旧,但是一个很好的起点.
读完之后,我的答案可能会更有意义
不会.将您的服务注入ViewModel.ViewModel将是一个Facade(并且可以封装适配器,装饰器,缓存和您决定需要的任何其他模式)
我没有在这里看到一个问题,但我们确实有类似于你所描述的情况.我们使用Guava的EventBus在分离的组件之间进行通信.这样,如果你需要弹出一个新窗口,你可以:
eventBus.post(new NewWindowRequest(theComponent))
你的主应用程序可以订阅同一个事件,然后弹出窗口.
MVVM和谨慎使用EventBus可以提供帮助.此外,Vaadin的BeanItem和ObjectProperty可用于传播更改,因为它们是Vaadin内置观察者/数据绑定模式的一部分.
我最近做了关于MVC vs MVP vs MVVM的演讲.示例代码可以帮助您理解从MVC到MVVM的转变.它是用JavaScript编写的,但它很简单,我相信大多数人都可以遵循它.我欢迎您提供任何反馈.
Vaadin是一款非常棒的软件,你绝对不应该最终使用Spaghetti代码.无论如何,一切都取决于你.
答案1
不,不是.无论使用何种框架,紧耦合都很糟糕.您的示例(ContactWidget)描述了列表的自定义实现.它可以呈现为包含或不包含其他信息的表.我将使用表示例,因为它更复杂,也更灵活(您可以构建具有高级表组件和正确数据绑定的整个应用程序).
Vaadin根据众所周知的MVC模式定义了高级数据模型.有三个嵌套层:容器,项,属性(属性查看器和编辑器也定义).Vaadin的书提出了一个很好的类比:电子表格应用程序.因此容器,项和属性将对应于表,行和单元格.容易想象 - 易于理解.最后,ItemContainer将揭示它的本质,你会明白这是任何良好和灵活的基于Vaadin的架构的关键契约.我建议通过Vaadin书来了解所有其他细节:
您还可以查看任何PagedTable插件背后的容器实现,以便更好地理解.还请从ArrayContainer https://vaadin.com/directory#addon/array-container开始,它将为您简化很多.
答案2
传递主应用程序参考似乎不是一个好的解决方案.您确实注意到Application实例代表了会话,但是您可以更好地定义某种SessionContext契约(它仍然可以由您的应用程序实现).可以定义静态方法以提供对相关SessionContext实例的透明访问.在引擎盖下它可以使用ThreadLocal变量http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadLocal.html以这种方式你将摆脱所有传递的寄生参数.
答案3
精心设计您的层次结构.不要自己触发重绘,而是使用Refresher.密切关注整个架构.
最后,Vaadin使用起来很简单,所以在更改主代码库之前,请随意做一些微小的PoC和演示.
正如建议您也可以尝试MVVM https://vaadin.com/directory#addon/bambi-mvvm