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 |