设为首页 加入收藏

TOP

C语言实现《大话设计模式》中的观察者模式中的委托例程(四)
2014-11-24 00:04:11 来源: 作者: 【 】 浏览:98
Tags:语言 实现 《大话设计模式》 观察者 模式 委托
ete(pEntrust);
165. rt_free(pBoss);
166. }
167. static Boss *BossCreate(rt_size_t Size)
168. {
169. Boss *pBoss = (Boss *)rt_malloc(Size);
170. pBoss->pEntrust = EntrustCreate(sizeof(Entrust));
171. //重写函数
172. pBoss->GetSubjectState = BossGetSubjectState;
173. pBoss->SetSubjectState = BossSetSubjectState;
174. pBoss->Notify = BossNotify;
175. pBoss->Delete = BossDelete;
176. return pBoss;
177. }
178. //具体观察者
179. //看股票的同事
180. typedef struct _StockObserver StockObserver;
181. struct _StockObserver
182. {
183. char *Name;
184. Boss *pSub;
185. void (*CloseStock)(void *pObserver);
186. void (*Delete)(void *pObserver);
187. };
188. static void CloseStock(void *pCloseStock)
189. {
190. StockObserver *pStockObserver = ClassEntry(pCloseStock, StockObserver, CloseStock);
191. Boss *pSub = pStockObserver->pSub;
192. rt_kprintf(" %s,%s关闭股票行情,继续工作\n", pSub->GetSubjectState(pSub), pStockObserver->Name);
193. }
194. static void StockObserverDelete(void *pStockObserver)
195. {
196. rt_free(pStockObserver);
197. }
198. static StockObserver *StockObserverCreate(char *Name, void *pSub, rt_size_t Size)
199. {
200. StockObserver *pStockObserver = (StockObserver *)rt_malloc(Size);
201. pStockObserver->Name = Name;
202. pStockObserver->pSub = pSub;
203. pStockObserver->CloseStock = CloseStock;
204. pStockObserver->Delete = StockObserverDelete;
205. return pStockObserver;
206. }
207. //看NBA的同事
208. typedef struct _NBAObserver NBAObserver;
209. struct _NBAObserver
210. {
211. char *Name;
212. Boss *pSub;
213. void (*CloseNBA)(void *pObserver);
214. void (*Delete)(void *pObserver);
215. };
216. static void CloseNBA(void *pCloseNBA)
217. {
218. NBAObserver *pNBAObserver = ClassEntry(pCloseNBA, NBAObserver, CloseNBA);
219. Boss *pSub = pNBAObserver->pSub;
220. rt_kprintf(" %s,%s关闭NBA转播,继续工作\n", pSub->GetSubjectState(pSub), pNBAObserver->Name);
221. }
222. static void NBAObserverDelete(void *pNBAObserver)
223. {
224. rt_free(pNBAObserver);
225. }
226. static NBAObserver *NBAObserverCreate(char *Name, void *pSub, rt_size_t Size)
227. {
228. NBAObserver *pNBAObserver = (NBAObserver *)rt_malloc(Size);
229. pNBAObserver->Name = Name;
230. pNBAObserver->pSub = pSub;
231. pNBAObserver->CloseNBA = CloseNBA;
232. pNBAObserver->Delete = NBAObserverDelete;
233. return pNBAObserver;
234. }
235.
236. #endif
237.
238.
239.
240. #include "EntrustObserver.h"
241. //客户端
242. void EntrustObs(void)
243. {
244. Boss *huhasan = BossCreate(sizeof(Boss));
245. StockObserver *tongshi1 = StockObserverCreate("魏关姹", huhasan, sizeof(StockObserver));
246. NBAObserver *tongshi2 = NBAObserverCreate("易管查", huhasan, sizeof(NBAObserver));
247. //在委托里添加事件功能 www.2cto.com
248. huhasan->pEntrust->Add(huhasan->pEntrust, &(tongshi1->CloseStock));
249. huhasan->pEntrust->Add(huhasan->pEntrust, &(tongshi2->CloseNBA));
250. //改变通知者状态
251. huhasan->SetSubjectState(huhasan, "我胡汉三回来啦");
252. //通知者通知
253. huhasan->Notify(huhasan);
254.
255. huhasan->Delete(huhasan);
256. tongshi1->Delete(t
首页 上一页 1 2 3 4 下一页 尾页 4/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇消息发送VS设计模式 C++沉思录的.. 下一篇Golang lsof server

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: