代码改变世界

观察者模式、MVP、MVC、三层架构

2010-01-11 08:57  【当耐特】  阅读(7228)  评论(12编辑  收藏  举报

.NET内置观察者模式

MVC的由来?

三层架构的由来?

秉着重构的思想,一步一步从观察者模式重构到MVC重构到三层架构!

 

【一】.NET内置的观察者模式--事件

 1     public class MyEventArgs : EventArgs
 2         {
 3             private int id;
 4             public int Id
 5             {
 6                 get{return this.id;}
 7             }
 8             public MyEventArgs(int id)
 9             {
10                 this.id = id;
11             }
12         }
13 
14         public class User
15         {
16             public event EventHandler<MyEventArgs> IdChanged;
17             private int id;
18             public int Id
19             {
20                 get { return id; }
21                 set
22                 {
23                     id = value;
24                     IdChanged(thisnew MyEventArgs(id));
25                 }
26             }
27         }
28 
29 
30        public  class Controller
31        {
32          User user = new User();
33          private void OnIdChanged(object send, MyEventArgs args)
34          {
35            //把改变后的Id显示在网页里面
36             ShowInInerteNet(user);
37          }
38          public void Test()
39          {          
40            user.IdChanged += this.OnIdChanged;
41            //改变Id
42             user.Id="1314";
43          }
44        } 

 

这就是观察者模式,就这么简单。

 

【二】MVC的由来

如果我不想让id显示在网页里,我要让他显示在winform窗体里,那么类Controller的程序要频繁滴改动,根据开放关闭原则----对扩展开发  对修改关闭,所以很容易让人想到抽象出显示方式的。所以有:

 1 public interface IView
 2 {
 3         public void Show(User user);
 4 }
 5 public class IntertNetShow:IView
 6 {
 7         public void Show(User user)
 8         {
 9          //doSomething
10         }
11 }
12 public class WinFormShow:IView
13 {
14         public void Show(User user)
15         {
16          //doSomething
17         }
18 }
19       public  class Controller
20        {
21          //这里可以实现依赖注入
22          private  CustomShow customShow=new IntertNetShow();
23          User user = new User();
24          private void OnIdChanged(object send, MyEventArgs args)
25          {
26             customShow.Show(user);
27          }
28          public void Test()
29          {          
30            user.IdChanged += this.OnIdChanged;
31            //改变Id
32             GetIdFormDB(user);
33          }
34        } 

 

 

上面是user.Id是直接赋值,现在我想从数据库中读出id的值或者从XML中读出user.Id的值,那么Control类就需要频繁的修改。根据开发关闭原则-----对扩展开发  对修改关闭,也和上面同样的思想,把改变Id的方法抽象出来。

 1 public interface IModel
 2 {
 3         public void GetId(User user);
 4 }
 5 public class GetIdFromDB: IModel
 6 {
 7         public void GetId(User user)
 8         {
 9          //doSomething
10         }
11 }
12 public class GetIdFromXML:IModel
13 {
14         public void GetId(User user)
15         {
16          //doSomething
17         }
18 }
19    public  class Control
20        {
21          //这里可以实现依赖注入
22          private  IView view=new IntertNetShow();
23          //这里可以实现依赖注入
24           private  IModel model=new GetIdFromDB();
25          User user = new User();
26          private void OnIdChanged(object send, MyEventArgs args)
27          {
28             view.Show(user);
29          }
30          public void Test()
31          {          
32            user.IdChanged += this.OnIdChanged;
33            //改变Id
34            model.GetId(user);
35          }
36        } 

 

所以重构完成===》MVP.   完整的代码如下:

 

代码
 1 public interface IView
 2 {
 3         public void Show(User user);
 4 }
 5 public class IntertNetShow:IView
 6 {
 7         public void Show(User user)
 8         {
 9          //doSomething
10         }
11 }
12 public class WinFormShow:IView
13 {
14         public void Show(User user)
15         {
16          //doSomething
17         }
18 }
19 
20 public interface IModel
21 {
22         public void GetId(User user);
23 }
24 public class GetIdFromDB: IModel
25 {
26         public void GetId(User user)
27         {
28          //doSomething
29         }
30 }
31 public class GetIdFromXML:IModel
32 {
33         public void GetId(User user)
34         {
35          //doSomething
36         }
37 }
38 
39    public  class Controller
40        {
41          //这里可以实现依赖注入
42          private  IView view=new IntertNetShow();
43          //这里可以实现依赖注入
44          private  IModel model=new GetIdFromDB();
45          User user = new User();
46          private void OnIdChanged(object send, MyEventArgs args)
47          {
48             view.Show(user);
49          }
50          public void Test()
51          {          
52            user.IdChanged += this.OnIdChanged;
53            //改变Id
54           model.GetId(user);
55          }
56        } 

 重构至MVC,完整代码如下

代码
 1 public interface IView
 2   {       
 3           public void Show(IModel model);
 4   }
 5   public class IntertNetShow:IView
 6   {        
 7           public void Show(IModel model)
 8           {
 9            //doSomething
10          }
11  }
12  public class WinFormShow:IView
13  {       
14          public void Show(IModel model)
15          {
16           //doSomething
17          }
18  }
19  
20  public interface IModel
21  {
22          public User GetId(User user);
23  }
24  public class GetIdFromDB: IModel
25  {
26          public User GetId(User user)
27          {
28           //doSomething
29          }
30 }
31  public class GetIdFromXML:IModel
32  {
33          public User GetId(User user)
34          {
35           //doSomething
36          }
37  }
38  
39     public  class Controller
40         {
41           //这里可以实现依赖注入
42           private  IView view=new IntertNetShow();
43           //这里可以实现依赖注入
44           private  IModel model=new GetIdFromDB();
45           User user = new User();
46           private void OnIdChanged(object send, MyEventArgs args)
47           {
48              view.Show(model);
49           }
50           public void Test()
51           {          
52             user.IdChanged += this.OnIdChanged;
53             //改变Id
54           model.GetId(user);
55           }
56         } 

 可以看得出MVC比MVP更加松耦合!