程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> ASP編程 >> ASP技巧 >> 把【觀察者模式】【MVC】【三層架構】說透

把【觀察者模式】【MVC】【三層架構】說透

編輯:ASP技巧

最近發現好多朋友 觀察者模式 MVC  三層架構不分,所以獨立開篇,把他們說明白說透!而且有很多理解誤區,列舉如下:
誤區一:觀察者模式==MVC
誤區二:三層架構==MVC
誤區三:ASP.Net MVC==MVC
誤區四:WebForm編程模型沒有用到MVC

 

.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(this, new 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        }


所以重構完成===》MVC.   完整的代碼如下:

 

代碼
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        }

 


細心的朋友可以發現,這很像webform和winform編程模型。對!webform和winform也用了MVC。

所以說ASP.Net MVC和WebForm都只不過是以不同的方式MVC罷了·····     那麼三層架構又是怎麼來的呢?三層架構是用來面對怎麼的變化的呢?請聽下回分解。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved