掏宝店

yihui.huang

asp.net , c# , jsp

MVP模式 -- 解决了实际项目的重用问题

最近我们的项目中有个winform的应用,是有关一些长任务操作,所以需要在用户UI上做些提示,这块部署成客户端的形式共用户使用。之前没考虑的太多,摘录一小段代码:

public partial class Flat : UserControl
{

public void Main()

{

BeginEdit();

}

      public void BeginEdit()
      {

              AppendText("正在获取数据...");
              dts = DateTime.Now;
              HtmlOnSale = ChangePage(i);
              BaseHelper.SaveGoodInfo(UserName);

      }

 public void AppendText(string text)
        {
            txtResult.Text += text + "\r\n";

            txtResult.Refresh();
            txtResult.SelectionStart = txtResult.Text.Length;
            txtResult.ScrollToCaret();
            txtResult.Focus();
        }

}

大概代码长成这样,先不要关注里面代码的完好,因为只复制了一部分,里面带有红色标记的接下来会遇到麻烦。

当时代码虽然丑点,但还是可以满足需求的。最近加了个需求,需要在服务器端也部署一套这样的应用程序,但里面具体的业务操作是一摸一样的,但在UI上不需要操作显示状态;当然业务一摸一样,肯定是要重用的,所以就需要对这段代码重构,因为操作里面确实夹杂着很多的AppendText这样的调用,那把整块操作都搬到另外的类去是不行的,而且这个还是继承UserControl的,所以要满足这样的需求想到了MVP模式,赞不知道还有没有其他能用的上的,应该有,只是暂时没想到。

改成这样:多一个工程项目,再多个FlatPresenter类, 然后把这些操作搬到Presenter去,但Presenter怎么调用Flat的AppendText方法呢,再多一个IFlatView接口,AppendText作为接口的一个方法,然后Flat也继承IFlatView,  public partial class Flat : UserControl,IFlatView{},这样子另外的这个程序就可以让他也继承IFlatView,改写AppendText不让他在UI上做操作就可以了,MVP除了提高测试率外,改进代码的可重用性也是很不错的。

改完的代码大概长这样:

 public interface IFlatView
    {

 void AppendText(string text);

}

 

public partial class Flat : UserControl,IFlatView
{

FlatPresenter m_presenter = new FlatPresenter (this);

public void Main()

{

m_presenter.BeginEdit();

}

     public void AppendText(string text)
        {
            txtResult.Text += text + "\r\n";

            txtResult.Refresh();
            txtResult.SelectionStart = txtResult.Text.Length;
            txtResult.ScrollToCaret();
            txtResult.Focus();
        }

}

public class FlatPresenter

{

  public FlatPresenter(IFlatView view)
        {
            m_View = view;
        }

  public void BeginEdit()
      {

              m_View.AppendText("正在获取数据...");
              dts = DateTime.Now;
              HtmlOnSale = ChangePage(i);
              BaseHelper.SaveGoodInfo(UserName);

      }

}

大概是这样的,问题总算解决了。呵呵,看大伙有没有更好的建议。

posted on 2008-09-19 18:22  yihui.huang  阅读(2270)  评论(12编辑  收藏  举报

导航