设为首页 加入收藏

TOP

C语言实现《大话设计模式》中的观察者模式中的委托例程(二)
2014-11-24 00:04:11 来源: 作者: 【 】 浏览:96
Tags:语言 实现 《大话设计模式》 观察者 模式 委托
st->pListPointArray[pListIndex]; //拷贝
68. tListIndex++; //拷贝序号加1
69. }
70. }
71. pList->Total = (SavePointArray == tListPointArray) pList->Total - 1 : pList->Total; //根据保留的内存块改变总数的值
72. if(FreePointArray != RT_NULL) rt_free(FreePointArray); //释放该释放的不用的内存块
73. pList->pListPointArray = SavePointArray; //保留该保留的
74. }
75. //List构造函数
76. static List *ListCreate(void)
77. {
78. List *pList = (List *)rt_malloc(sizeof(List));
79. pList->Total = 0;
80. pList->pListPointArray = RT_NULL;
81. pList->Add = ListAdd;
82. pList->Remove = ListRemove;
83. pList->Delete = ListDelete;
84. return pList;
85. }
86. //委托类
87. typedef void (*Event)(void *);
88. typedef struct _Entrust Entrust;
89. struct _Entrust
90. {
91. List *FunArray;
92. void (*Add)(void *pEntrust, void *pObject);
93. void (*Remove)(void *pEntrust, void *pObject);
94. void (*Update)(void *pEntrust);
95. void (*Delete)(void *pEntrust);
96. };
97. static void EntrustAdd(void *pEntrust, void *pFun)
98. {
99. List *pList = ((Entrust *)pEntrust)->FunArray;
100. pList->Add(pList, pFun);
101. }
102. static void EntrustRemove(void *pEntrust, void *pFun)
103. {
104. List *pList = ((Entrust *)pEntrust)->FunArray;
105. pList->Remove(pList, pFun);
106. }
107. static void EntrustUpdate(void *pEntrust)
108. {
109. List *pListFun = ((Entrust *)pEntrust)->FunArray;
110. int i;
111. int FunAddress;
112. if(pListFun->Total == 0) return;
113. for(i = 0; i < pListFun->Total; i++)
114. {
115. FunAddress = (int)(*(pListFun->pListPointArray + i));
116. //先将整型变量转换成一个整形指针,再将该指针指向的内容转换成Event函数指针
117. (*(Event)(*(int *)FunAddress))(pListFun->pListPointArray[i]);
118. }
119. }
120. static void EntrustDelete(void *pEntrust)
121. {
122. List *pList = ((Entrust *)pEntrust)->FunArray;
123. pList->Delete(pList);
124. rt_free(pEntrust);
125. }
126. static Entrust *EntrustCreate(rt_size_t Size)
127. {
128. Entrust *pEntrust = (Entrust *)rt_malloc(Size);
129. pEntrust->FunArray = (List *)ListCreate();
130. pEntrust->Add = EntrustAdd;
131. pEntrust->Remove = EntrustRemove;
132. pEntrust->Update = EntrustUpdate;
133. pEntrust->Delete = EntrustDelete;
134. return pEntrust;
135. }
136. //具体通知者
137. //通知者:老板
138. typedef struct _Boss Boss;
139. struct _Boss
140. {
141. Entrust *pEntrust; //添加一个委托类
142. char *Action;
143. char *(*GetSubjectState)(void *pBoss);
144. void (*SetSubjectState)(void *pBoss, char *pBossState);
145. void (*Notify)(void *pBoss);
146. void (*Delete)(void *pBoss);
147. };
148. static char *BossGetSubjectState(void *pBoss)
149. {
150. return ((Boss *)pBoss)->Action;
151. }
152. static void BossSetSubjectState(void *pBoss, char *pBossState)
153. {
154. ((Boss *)pBoss)->Action = pBossState;
155. }
156. static void BossNotify(void *pBoss)
157. {
158. Entrust *pEntrust = ((Boss *)pBoss)->pEntrust;
159. pEntrust->Update(pEntrust);
160. }
161. static void BossDelete(void *pBoss)
162. {
163. Entrust *pEntrust = ((Boss *)pBoss)->pEntrust;
164. pEntrust->Del
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇消息发送VS设计模式 C++沉思录的.. 下一篇Golang lsof server

评论

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