public interface ITestView { event Action SomeEvent; void ShowMessage(string msg); }
public partial class TestView : Window,ITestView { TestPresenter presenter; public TestView() { InitializeComponent(); presenter = new TestPresenter(this); this.btnSomething.Click += (sender, e) => { if (this.SomeEvent != null) SomeEvent(); }; } #region ITestView 成员 public event Action SomeEvent; public void ShowMessage(string msg) { MessageBox.Show(msg); } #endregion }
Presenter构造函数需要一个实现了Iview接口的View,并绑定IView里的事件,进行处理后调用IView里定义的方法
public class TestPresenter { public TestPresenter(ITestView view) { view.SomeEvent += () => { view.ShowMessage("MVP模式的测试"); }; } }
IView,只定义View的事件:
public interface ITestView { event Action SomeEvent; }Presenter构造函数需要一个实现了Iview接口的View,并绑定IView里的事件,进行处理后调用自己定义的触发自己事件的方法:View,实现IView,并且在构造函数里初始化Presenter,并且绑定Presenter里的事件 :public partial class TestView : Window,ITestView { TestPresenter presenter; public TestView() { InitializeComponent(); presenter = new TestPresenter(this); presenter.ShowMessage += (msg) => { MessageBox.Show(msg); }; this.btnSomething.Click += (sender, e) => { if (this.SomeEvent != null) SomeEvent(); }; } #region ITestView 成员 public event Action SomeEvent; #endregion }
public class TestPresenter { public event Action<string> ShowMessage; private void OnShowMessage(string msg) { if (ShowMessage != null) ShowMessage(msg); } public TestPresenter(ITestView view) { view.SomeEvent += () => { OnShowMessage("MVP模式测试"); }; } }
第一种方法,IView需要定义用户可能会触发的事件,并且需要提供一些方法。
我的理解是这样的IView相当清楚自己会怎么样,并且还知道自己能干什么,什么自己干不了。编写View的时候只要完成IView里定义的事件,并且把IView里定义的“能干的事情”都实现,不需要去关注Presenter里到底会怎么样。
编写Presenter的人清楚的知道View能干什么事情,会触发什么事件。知道处理一些业务逻辑后自己该怎样去指挥View。
自己感觉这样的方法,主控权是Presenter。View只是去执行,而且必须执行,没有选择权。(因为View继承IView接口,必须实现IView里定义的方法)
第二种方法,IView只定义用户可能会触发的事件。
我的理解是这样的IView只知道自己会怎么样,并不知道自己能干什么。编写View的时候需要要完成IView里定义的事件,并且需要清楚Presenter会发生什么样的事件,我要不要处理Presenter里发生的事件。
编写Presenter的人不知道View能干什么事情,当接受到View发生的事件后,处理一些业务逻辑后,只是触发自己的事件,View层处理不处理,Presenter就不关心了。
自己感觉这样的方法,Presenter 和 View 都回去控制一些东西,View有了选择权。(因为View可以监听Presenter的事件,也可以不监听)。
自己老感觉MVP模式应该是第一种写法,但是和我们项目中用到的不一样,而且思想上好像有很大的差别,希望大家能给我一些指导,
第二种方法有什么好处? 真正的MVP模式处理这种问题应该是怎么写的?