• 当MVP遇到C


    简述:
           看到大家评论的这么多,我目的达到。我放上去的代码,其实是有点值得疑义之处,所以我在标题后加[讨论版]的字样。拿上篇文章中"saucer"评论,他说的没错。其实Model View Presenter也是不固定的,web Client Software Factory使用的就是Mode View Presenter + Controller模式(MVPC模式),当然代码改进是必须的,此篇所表现的Demo,是一个MVP+C模式简易实现,不过因为没有加入Ioc,所以还是有值大家添砖加瓦的地方。ok.

    观点认同方面:见贴子底部
          
    代码部分:
           首先,先写一段伪代码:
     public interface IView
     {
     }
     public class Presenter
     {
          IView view;
          Controller controller;
     }
     public partial class TestPage: Page, IView
     {
            Presenter presenter;
     }

     public class Controller
     {
            Data data;
     }

     public class Data
     {
     }

    那为什么要加上Controller呢?
        一句话:加上Controller可以让多个Presenter 共享DataModel
        那Controller 类中可以包括数据的缓冲,获取和数据的更新etc,其实Controller这时变成一个相对独立的控制器,当然也可以把Controller用作状态控制器
    比如:一个Presenter向Controller发送Next(调用Next方法)
        Controller根据当前的状态导航到相应的页面,他就可以通过调用一个导航服务对象来导航,Controller本身并不处理导航,Clear。其实学习完Web Client SofteWare Factory基本就明白了。

    PresenterLayer:

    namespace MVPDesign.Presenter
    {
        
    public interface IDataView
        
    {
            Int32 DataId 
    get; }
            String Title 
    set; }
            String Text 
    set; }
        }

    }


    namespace MVPDesign.Presenter
    {
        
    using MVPDesign.Control;

        
    public class DataPresenter
        
    {
            IDataView view;
            

            
    public DataPresenter(IDataView view)
            
    {
                
    this.view = view;
            }


            
    public void RetrieveData()
            
    {
                Controller controller 
    = new Controller(view.DataId);
                view.Title 
    = controller.Title;
                view.Text 
    = controller.Text;
            }

        }

    }

    ViewLayer:
    namespace MVPDesign.ViewLayer
    {
        
    using MVPDesign.Presenter;

        
    public partial class TestPage : Page, IDataView
        
    {
            DataPresenter dataPresenter;

            
    protected void Page_Load(object sender, EventArgs e)
            
    {
                dataPresenter 
    = new DataPresenter(this);
            }


            
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
            
    {
                dataPresenter.RetrieveData();
            }


            Int32 IDataView.DataId
            
    {
                
    get return Convert.ToInt32(this.DDL.SelectedValue); }
            }


            String IDataView.Title
            
    {
                
    set this.lblTitle.Text = value; }
            }


            String IDataView.Text
            
    {
                
    set this.lblText.Text = value; }
            }

        }

    }


    ModelLayer: 代码同前篇文章
    XML源:同前篇文章

    Controller:
    namespace MVPDesign.Control
    {
        
    using MVPDesign.ModelLayer;

        
    public class Controller
        
    {
            
    private int id;
            
            
    public Controller(int ID)
            
    {
                id 
    = ID;
            }

            
            
    private XmlData GetXmlData()
            
    {
                
    return XmlData.GetDataById<XmlData, Int32>(id);
            }


            
    public String Title
            
    {
                
    get return GetXmlData().Title; }
            }

            
            
    public String Text
            
    {
                
    get return GetXmlData().Text; }
            }

        }

    }

    讨论处[有关于观点认同方面]:

    “我觉得MVP模式完是理化的方法, 在实际工作上完全不可能用, 试想asp.net的控件和winform的控件差别还是很大的,不可能完全一致 ” 评论者:dali

    @dali
    非常同意你的观点,只要界面稍微复杂点,用起mvp来是恼火的.况且lz说的好像也不是真正的mvp,mvp提倡所有的view要实现Iview,而将具体的界面调用委托给展示层,外表上非常的解偶,也就是说以前你winform写的程序,可以很好的转移到webform中,由于展示层和view中的控件已经实现解偶,所以winform和webform中控件的不一致对它的影响非常小,更由于它推荐的是事件委托,所以解偶还算比较彻底.但是,还是那句话,要是界面很复杂呢,比如充斥大量用户自定义控件和服务控件,这时开发起来就比较麻烦,效率会很低.
    评论者:hehehe

    针对以上所评:首先,我是不怎么同意的;其次,询问经常使用此模式的一些人
        凌说:以上有一点可能不准确,wpf应该在web和winform都是使用一套控件
        niwalker言:以上说法是错误的;不说别的,在我的项目中就已经用过多次mvp和mvpc模式了

    嗯,欢迎大家侃侃

  • 相关阅读:
    Java I/O (1)
    hadoop集群添加新节点
    [kuangbin带你飞]专题三 Dancing Links
    Codeforces Round #580 (Div. 2)(A、B、C)
    2019 年百度之星&#183;程序设计大赛
    [kuangbin专题] KMP
    Codeforces Round #578 (Div. 2)(A、B、C、D、E)
    二维前缀和、差分习题集
    [kuangbin带你飞]专题七 线段树
    Codeforces Round #577 (Div. 2) (A、B、C)
  • 原文地址:https://www.cnblogs.com/RuiLei/p/908934.html
Copyright © 2020-2023  润新知