一个模式
控制器

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace RGeos.FrameWork.MVC
7 {
8 //控制类
9 public interface IController
10 {
11 string Name { get; }
12 IExecutor Executor { get; }
13 IObserver Observer { get; }
14 }
15 public abstract class AbstractController : IController
16 {
17 protected string mName;
18 protected IExecutor mExecutor;
19 protected IObserver mObserver;
20 //从外部传入被观察者
21 //控制器内部构造观察者,并向被观察者注册,观察者和控制器总是成对出现
22 protected AbstractController(string name, IExecutor executor)
23 {
24 this.mName = name;
25 this.mExecutor = executor;
26 }
27
28 public virtual IExecutor Executor
29 {
30 get
31 {
32 return this.mExecutor;
33 }
34 }
35
36 public virtual string Name
37 {
38 get
39 {
40 return this.mName;
41 }
42 }
43
44 public virtual IObserver Observer
45 {
46 get
47 {
48 return this.mObserver;
49 }
50 }
51 //业务逻辑
52 public virtual void HandExecuter()
53 {
54 }
55 public virtual bool OnRemove(object o, params object[] assistant)
56 {
57 return this.mExecutor.OnRemove(o, assistant);
58 }
59 public virtual bool OnAdd(object o, params object[] assistant)
60 {
61 return this.mExecutor.OnAdd(o, assistant);
62 }
63 public virtual bool OnReplace(object o, params object[] assistant)
64 {
65 return this.mExecutor.OnReplace(o, assistant);
66 }
67
68 }
69 }
被观察者

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace RGeos.FrameWork.MVC
7 {
8 //被观察者,执行者
9 public interface IExecutor
10 {
11 string Name { get; }
12
13 bool IsStateChanged { get; }
14
15 bool NeedRefresh { get; }
16 //观察者集合
17 List<IObserver> Observers { get; }
18
19 bool OnAdd(object o, params object[] assistant);
20 bool OnRemove(object o, params object[] assistant);
21 bool OnReplace(object o, params object[] assistant);
22
23 void NotifyObservers();
24 //添加观察者
25 bool RegisterObserver(IObserver view);
26 //注销观察者
27 bool UnRegisterObserver(IObserver view);
28 //注销所有观察者
29 bool UnRegisterObservers();
30 }
31 public abstract class AbstractExecutor : IExecutor, ICloneable
32 {
33 protected bool mIsStateChanged;
34 protected string mName;
35 protected bool mNeedRefresh;
36 protected List<IObserver> m_observers;
37 public bool IsStateChanged
38 {
39 get
40 {
41 return this.mIsStateChanged;
42 }
43 }
44
45 public string Name
46 {
47 get
48 {
49 return this.mName;
50 }
51 }
52 public bool NeedRefresh
53 {
54 get
55 {
56 return this.mNeedRefresh;
57 }
58 }
59
60 public List<IObserver> Observers
61 {
62 get
63 {
64 return this.m_observers;
65 }
66 }
67
68 protected AbstractExecutor(string name)
69 {
70 this.mName = name;
71 this.mNeedRefresh = true;
72 this.mIsStateChanged = false;
73 this.m_observers = new List<IObserver>();
74 }
75 protected AbstractExecutor()
76 {
77 this.mNeedRefresh = true;
78 this.mIsStateChanged = false;
79 this.m_observers = new List<IObserver>();
80 }
81
82
83 public virtual object Clone()
84 {
85 return null;
86 }
87
88 public virtual bool RegisterObserver(IObserver observer)
89 {
90 if (this.m_observers == null)
91 {
92 this.m_observers = new List<IObserver>();
93 }
94 if (!this.m_observers.Contains(observer))
95 {
96 this.m_observers.Add(observer);
97 return true;
98 }
99 return false;
100 }
101
102 public virtual bool UnRegisterObserver(IObserver observer)
103 {
104 if (this.m_observers != null)
105 {
106 while (this.m_observers.Contains(observer))
107 {
108 return this.m_observers.Remove(observer);
109 }
110 }
111 return false;
112 }
113
114 public virtual bool UnRegisterObservers()
115 {
116 if (this.m_observers != null)
117 {
118 this.m_observers.Clear();
119 this.m_observers = null;
120 return true;
121 }
122 return false;
123 }
124
125 public virtual bool OnAdd(object o, params object[] assistant)
126 {
127 this.mIsStateChanged = true;
128 this.NotifyObservers();
129 return true;
130 }
131 public virtual bool OnRemove(object o, params object[] assistant)
132 {
133 this.mIsStateChanged = true;
134 this.NotifyObservers();
135 return true;
136 }
137 public virtual bool OnReplace(object o, params object[] assistant)
138 {
139 this.mIsStateChanged = true;
140 this.NotifyObservers();
141 return true;
142 }
143 public virtual void NotifyObservers()
144 {
145 if (this.mNeedRefresh)
146 {
147 if (this.mIsStateChanged)
148 {
149 foreach (IObserver observer in this.m_observers)
150 {
151 observer.OnUpdate(this);
152 }
153 }
154 }
155 this.mIsStateChanged = false;
156 }
157 }
158
159 }
观察者

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace RGeos.FrameWork.MVC
7 {
8 //观察者
9 public interface IObserver
10 {
11 IController Controller { get; }
12 IExecutor Executor { get; }
13 string Name { get; }
14
15 void InitializeObserver();
16 //更新观察者
17 void OnUpdate(IExecutor currentExecutor);
18 }
19 public abstract class AbstractObserver : IObserver
20 {
21 protected IController mController;
22 protected IExecutor mExecutor;
23 protected string mName;
24
25 public abstract void InitializeObserver();
26 public abstract void OnUpdate(IExecutor currentExecutor);
27
28 public virtual IController Controller
29 {
30 get
31 {
32 return this.mController;
33 }
34 }
35
36 public virtual IExecutor Executor
37 {
38 get
39 {
40 return this.mExecutor;
41 }
42 }
43
44 public virtual string Name
45 {
46 get
47 {
48 return this.mName;
49 }
50 }
51 //观察者通过控制器引用,调用被观察者的方法,更新其他的观察者。
52 //此时观察者和被观察者不通信
53 protected AbstractObserver(string name, IController controller)
54 {
55 this.mName = name;
56 this.mController = controller;
57 this.mExecutor = controller.Executor;
58 }
59 //在控制器中构造观察者时,将被观察者传入观察者,这样观察者可以调用被观察者中的数据。
60 //此时观察者和被观察者通信
61 protected AbstractObserver(string name, IController controller, IExecutor executor)
62 {
63 this.mName = name;
64 this.mController = controller;
65 this.mExecutor = executor;
66 }
67 }
68
69 }
这个是MVC还是MVP?说不清。
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
分类:
设计模式
, 编程开发集合 / C#开发
标签:
MVC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2013-04-20 [WorldWind学习]12.WavingFlags和WavingFlagLayer
2013-04-20 [WorldWind学习]11.TerrainViewer插件和双线程
2013-04-20 [WorldWind学习]9.WW的屏幕坐标到经纬度坐标计算
2013-04-20 [WorldWind学习]6.World类
2013-04-20 [WorldWind学习]10.插件结构
2013-04-20 [WorldWind学习]8.Cache对象
2013-04-20 [WorldWind学习]7.RenderableObject对象