在经历大学和跟踪SO的发展时,我听到了很多关于模型 - 视图 - 控制器架构设计模式的知识.我甚至在我知道它之前就无意中使用了MVC模式,并且仍然在我的日常工作中使用它.从我所看到的,它可能是今天使用的最流行的模式.然而,我没有听到太多关于可以使用的替代模式而不是MVC.有哪些选项,以及您决定在MVC上使用它们的原因是什么?我也有兴趣了解它们常用的系统类型.最后,使用它们的优点和缺点是什么?
model-view-controller mvp architectural-patterns passive-view
我正在用C#开发一个WinForms应用程序.我在GUI编程方面经验有限,而且我必须在飞行中学到很多东西.话虽这么说,这就是我正在建设的.
请参阅常规GUI查看以下链接:
GUI http://img227.imageshack.us/img227/1084/program0.jpg
现在,我已经完成了很多工作,但是在非常糟糕的自治设计模式中.我不知道该项目是否会达到一定的规模,因此,是时候进行一些重大的重构了.
我一直在研究GUI设计模式,我希望实现的模式是被动视图(参见http://martinfowler.com/eaaDev/PassiveScreen.html).我正在寻找一些如何将这些结合在一起的帮助.
背景:
1)根据用户在"TreeView"中单击的内容,左下角的"列表"将显示可填充"编辑器"区域的对象列表.这些对象可能是TextBox或DataGridView.用户切换列表以选择他/她想要在"编辑器"中看到的内容
2)该模型本质上是一个包含数据和配置文件的文件夹.有一个外部程序在给定目录上运行,创建输出文件/文件夹等.我正在开发的这个程序旨在以用户友好的方式有效地管理/配置这些对象
3)我一直在做的事情的问题是它几乎不可能测试,因此转向MVP-esque被动视图设计模式
我试图让它成为独立于View的程序.我无法找到任何更复杂的交互式视图与被动视图模式一起使用的示例.
问题:
1)我是否需要为程序的整个"外观"实现一个大的接口/视图,然后为每个TreeView,Editor,Logger等实现子接口/子视图?或者这样做有更好的"结构"吗?
2)当从视图"移交"事件到演示者/控制器时(无论你想使用什么术语WRT被动视图设计模式),我应该这样做的方式是什么?有时我有简单的属性需要更新,有时我需要一系列的步骤来展开.
我会喜欢这个主题的建议和意见.我已经浏览了互联网,但我没有找到足够的例子来帮助我继续这个项目.
提前致谢!
丹尼尔
我目前面临一个难题:将两个javascript对象连接在一起的正确方法是什么?
想象一下像文本编辑器这样的应用程序,它有几个不同的文件.我有一些HTML页面代表笔记本的视图.我有一个文件notebook.js,其中包含NotebookController和Notebook View的类定义.
NotebookControler对象负责在笔记本上执行业务逻辑,如"保存笔记本","加载笔记本","新笔记本".NotebookView负责管理用于演示的HTML.它做低级别的东西,如"获取/设置笔记本电脑主体""获取/设置笔记本名称".它还侦听DOM事件(onClick)并触发业务事件(saveNotebook).这是我对被动视图模式的尝试.
我希望我的javascript客户端代码是面向对象的,分离的关注点和单元可测试的.我想用模拟NotebookView测试NotebookController,反之亦然.这意味着我不能只在NotebookController中实例化NotebookView.我也是
在Java中,选择是自然的:使用Spring.但这似乎不是JavaScript-y.什么是正确的做法?
我试图在java swing ui应用程序中遵循MVP(特别是Passive-View)模式.
应用程序的基本设计提醒向导控件.屏幕分为两个主要部分:
用户可以使用按钮更改活动视图,但始终显示该栏.
在这个场景建模中,我有一堆不同的screers,每个都有自己的演示者,视图界面和视图实现(使用JPanel).然后我有一个Shell演示者,使用JFrame查看intefrace和视图实现.这个想法是shell将首先加载并始终显示,显示底部导航栏并为活动视图留出空间.shell演示者将允许设置当前活动屏幕,有点像这样:
interface View {
}
class Presenter {
View view;
public Presenter(View view) {
this.view = view;
}
public View getView() {
return view;
}
}
interface ShellView extends View {
void setActiveView(View activeView);
}
class ShellPresenter extends Presenter {
private ShellView shellView;
public void setActivePresenter(Presenter activePresenter) {
shellView.setActiveView(activePresenter.getView());
}
}
class ShellFrame implements ShellView {
private JFrame frame;
private JPanel activePanel;
private JPanel navigationBar;
public ShellFrame() {
Container c = frame.getContentPane();
c.add(activePanel); …
Run Code Online (Sandbox Code Playgroud) 我正在设计一个具有以下基本概念的GUI(类似于Visual Studio的基本外观):
现在,我将使用TreeView进行文件导航,使用ListView选择要在编辑器中显示的控件,使用RichTextBox进行Logger.编辑器将具有两种类型的编辑模式,具体取决于TreeView中选择的内容.编辑器将是一个RichTextBox,用于手动编辑文件内的文本,或者它将是一个带有拖放DataGridViews和子文本框的面板,用于在此面板中进行编辑.
我试图遵循被动视图设计模式,将模型与视图完全分离,反之亦然.这个项目的本质是我添加的任何组件都需要编辑/删除.因此,我需要从给定控件到下一个控件的独立性.如果今天我使用TreeView进行文件导航,但明天我被告知要使用其他东西,那么我想要相对容易地实现一个新的控件.
我根本不明白如何构建程序.我理解每个Control的一个Presenter,但我不知道如何使它工作,以便我有一个View(程序的整个GUI)和控件(子视图),这样整个视图是可替换的以及个人反映我的模型的控件.
在主视图中,Passive View标准应该是轻量级的,我是否单独实现子视图?如果是这样,请说我有一个接口INavigator来抽象导航器对象的角色.导航器需要Presenter和Model才能在Navigator View和主View之间进行操作.我觉得我迷失在某个地方的设计模式行话中.
可以在这里找到最相似的相关问题,但它没有足够详细地回答我的问题.
有人请帮我理解如何"构建"这个程序吗?我感谢任何帮助.
谢谢,
丹尼尔
我正在学习Passive View模式,以便让我的C#WinForms应用程序更容易测试和维护.
它到目前为止运作良好但我想知道是否有更好的方法来实现事件而不是我现在这样做(并保持它们可测试).这就是它的样子(省略与此示例无关的代码).基本上我正在寻找的是如果有一种方法可以在演示者和表单中跳过连接事件,我宁愿在演示者中完成所有工作.
我的观点如下:
public interface IApplicationView
{
event EventHandler Find;
}
Run Code Online (Sandbox Code Playgroud)
我的主持人看起来像这样:
public class ApplicationPresenter
{
private IApplicationView _view;
private IApplicationDomain _domain;
public ApplicationPresenter(IApplicationView view) : this(view, new ApplicationDomain()) {}
public ApplicationPresenter(IApplicationView view, IApplicationDomain domain) {
_view = view;
_domain = domain;
HookupEventHandlersTo(view);
}
private void HookupEventHandlersTo(IApplicationView view)
{
view.Find += delegate { FindAction(); };
}
public void FindAction()
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我的WinForm看起来像:
public partial class Form1 : Form, IApplicationView
{
private ApplicationPresenter _presenter;
public event EventHandler …
Run Code Online (Sandbox Code Playgroud) 我找到了M. Fowler关于被动视图模式的文章.我想在我的申请中申请.我使用Swing for UI.我花了几个小时搜索教程或示例如何实现它,但没有找到太多有用的东西.有人可以帮助理解设计或提供好的例子吗?通过MVP中的"M",我理解"域模型".
我已经开始围绕整个MVP模式,尽管我对单个对象做得很好,但是当涉及到集合时,它开始变得困难.
所以我们假设我们正在构建一个简单的WinForms应用程序,它由一个Form中的DataGrid组成,数据Model是一个简单的东西集合,其中这些东西有很多属性,而View实际上会显示它们:
模型
public class Person
{
public string Name { get; set; }
public DateTime Birth { get; set; }
public bool IsCool { get; set; }
}
public class People
{
public List<Person> Persons { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
视图
public interface IPeopleView
{
List<People> ListOfPeople { get; set; }
}
public partial class PeopleViewImpl : Form, IPeopleView
{
private DataGridView _grid = new DataGridView();
public PeopleViewImpl()
{
InitializeComponent();
}
// Implementation of IPeopleView
public List<People> …
Run Code Online (Sandbox Code Playgroud) 我正在重构一个WinForms(.NET 4)应用程序,该应用程序使用TabControl来包含UserControl - UserControl在每个TabPage中实例化,最终结果是每个选项卡中的编辑器.这些正在编辑一组项目,这些项目最终会被整个表单输入到正在编辑的对象中.
作为示例类结构:
class School
string Name
string Address
Course
,每个具有几个相应的字段(Department
,Name
等)(它实际上不是与学校相关的应用程序,但这个比喻有效.)
在视觉上,UserControls集管理Course
es,而父Form处理School
信息.
现在,我有一个Form/School的演示者,以及UserControl/Course的演示者,每个人都有一个视图.然而,学校的主持人需要控制课程的一些信息.例如,为一个课程选择的选项限制其他课程中的选项.该School
模型正在处理该计算,但它需要到达课程的演示者.
我在MVP讨论中找到这种关系的例子并没有太大的成功,这是我第一次采用MVP方法.处理这个有什么好办法吗?学校的主持人是否适合收集课程主持人的集合来代表该集?学校的观点是否应该收集课程观点的集合?(最终的UserControls必须以某种方式和某个地方附加到表单上,对吧?)
我的主要目标是(不出所料)提高可测试性和可维护性,到目前为止,这个过程的主要来源是Michael Feathers的"The Humble Dialog Box"和Jeremy Miller的"Build You Own CAB"系列.
除了30年的模式之外,MVC从未用于当前的应用程序.MVP是其继任者,旨在处理90年代推出的基于事件的应用程序.被动视图和监督控制器似乎已经上升到顶部.对于这两者,几乎没有必要谈论MVC/MVP.
具体来说,ASP.NET MVC中的控制器操作是否会带回创建该视图的视图?在MVC中,控制器不会创建视图或与它们对话.将ASP.NET MVC称为MVC实现有多准确?或者,它的准确名称是什么?
model-view-controller mvp asp.net-mvc design-patterns passive-view
passive-view ×10
mvp ×8
c# ×3
winforms ×3
java ×2
swing ×2
.net ×1
asp.net-mvc ×1
javascript ×1