代码重构,用Observer模式进行封装时遇到问题疑问。

wanyyl2353406 2011-05-05 04:18:44
小弟现在遇到一个问题,FrameWork(框架)在与各个不同的Controller(不同用户交互tab页)进行通信,我用Observer模式进行封装,两者是一对多的关系,每一个Controller是在FrameWork中开始运行时作为dll加载上来,并把Controller的hwnd保存到一个链表里面,这个list(FrameWork中的成员)保存了所有Controller的hwnd,Framework与Controller之间的通信只能通过发消息(因为是不同的dll),现在的问题是:Framework对目标数据的修改如Add,Delete,Modify等等的操作都需要通知每一个Controller,所以每个Controller都需要在OnCommand中对 对应的消息进行相应。这样子的后果是Framework要添加一个消息,每一个Controller就要去做对应的处理分支(添加个case),这样的耦合度太大了,但是我却不知道用什么好的方法可以解耦,望各位指点。
...全文
93 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你可以使用模板方法
xmu_才盛 2011-05-05
  • 打赏
  • 举报
回复
如果每个Controller都要处理 FrameWork的消息的话, 不妨试一下2楼的那个思路, 应该可行。
wanyyl2353406 2011-05-05
  • 打赏
  • 举报
回复
FrameWork发的消息 每一个Controller都要去处理。并不是要去判断ID而去让某个特定的Controller去处理,把 UI的处理放在dll中 有点 过度追求 模块化设计了,这句话在理,现在照成两者的通信 很死板,只有SendMessageW,每个Controller在OnCommand去处理(swicth case)对应的事件。
xmu_才盛 2011-05-05
  • 打赏
  • 举报
回复
1. 你的意思是 FrameWork 给 Controller 发消息时 Controller 们 中 有选择的相应 吗? 如果是有选择的相应, 你可以按照我说的 给 基类A 做一个ID, FrameWork 发送消息的时候顺便把 需要接受消息的Controller ID 加上。 然后基类A接到 这个消息后, 判断消息中的ID是否与 自己的ID相符合, 如果相符合则调用 doSomeThing。 这样也可以避免每个Controller 都要实现 OnCommand了

2. 我不赞同你把 选项板 放在dll中, 而且还设计了这么多的dll。 我觉得UI就是UI, 与主程序都放在一起比较合适, 底层可以封装不同的处理逻辑类, 放在不同的dll中。。
把 UI的处理放在dll中 有点 过度追求 模块化设计了。。
wanyyl2353406 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 newstudent_never 的回复:]

给 Controller 添加一个父类A,专门用来接受 来自FrameWork的消息, 剩下的处理下方给 各个 Controller。 其中父类A中加一个 虚函数 dosomeThing,给它一个默认的处理流程, 在该父类A的OnCommand 中相应 消息,并调用这个虚函数dosomeThing。。 由各个子类Controller 重载虚函数,做出处理。。

这样子就变成了 Frame……
[/Quote]
因为FrameWork与Controller之间是通过SendMessageW通信的(DLL通信的方式),所有我觉得抽象出一个类A,A中加个虚函数Dosoming(),将A其作为Controller的对象引用(组合的关系两者),在让每一个Controller去继承A,实现虚函数Dosoming(),每一个实现类通过引用在OnCommand中调用Dosoming(),我这个想法只是对OnCommand处理函数(变化部分)的封装。

因为我现在的架构做不到您说的(FrameWork 与 父类A的通信过程, 每个子类也不用添加 OnCommand了),FrameWork 只是保存了一个链表以存储Controller的dll句柄,然后通过迭代对每一个ControllerSendMessageW发消息,然后Controller中的OnCommand消息进行相应。
xmu_才盛 2011-05-05
  • 打赏
  • 举报
回复
给 Controller 添加一个父类A,专门用来接受 来自FrameWork的消息, 剩下的处理下方给 各个 Controller。 其中父类A中加一个 虚函数 dosomeThing,给它一个默认的处理流程, 在该父类A的OnCommand 中相应 消息,并调用这个虚函数dosomeThing。。 由各个子类Controller 重载虚函数,做出处理。。

这样子就变成了 FrameWork 与 父类A的通信过程, 每个子类也不用添加 OnCommand了。。


另外, 你这个不叫做, 观察者, 叫做迭代器比较合适。。

观察者是 Controller 通知 FrameWork 自己的数据变了, FrameWork 进行相应。。
本书开创性地深入揭示了重构与模式这两种软件开发关键技术之间的联系,说明了通过重构实现模式改善既有的设计,往往优于在新的设计早期使用模式。本书不仅展示了一种应用模式和重构的创新方法,而且有助于读者结合实战深入理解重构和模式。书中讲述了27种重构方式。 本书适于面向对象软件开发人员阅读,也可作为高校计算机专业、软件工程专业师生的参考读物。 第1章 本书的写作缘由 1 1.1 过度设计 1 1.2 模式万灵丹 2 1.3 设计不足 2 1.4 测试驱动开发和持续重构 3 1.5 重构与模式 5 1.6 演进式设计 6 第2章 重构 7 2.1 何谓重构 7 2.2 重构的动机 8 2.3 众目睽睽 9 2.4 可读性好的代码 10 2.5 保持清晰 11 2.6 循序渐进 11 2.7 设计欠账 12 2.8 演变出新的架构 13 2.9 复合重构与测试驱动的重构 13 2.10 复合重构的优点 15 2.11 重构工具 15 第3章 模式 17 3.1 何谓模式 17 3.2 模式痴迷 18 3.3 实现模式的方式不止一种 20 3.4 通过重构实现、趋向和去除模式 22 3.5 模式是否会使代码更加复杂 24 3.6 模式知识 25 3.7 使用模式的预先设计 26 第4章 代码坏味 29 4.1 重复代码(Duplicated Code) 31 4.2 方法过长(Long Method) 31 4.3 条件逻辑太复杂(Conditional Complexity) 32 4.4 基本类型迷恋(Primitive Obsession) 33 4.5 不恰当的暴露(Indecent Exposure) 33 4.6 解决方案蔓延(Solution Sprawl) 34 4.7 异曲同工的类(Alternative Classes with Different Interfaces) 34 4.8 冗赘类(Lazy Class) 34 4.9 类过大(Large Class) 34 4.10 分支语句(Switch Statement) 35 4.11 组合爆炸(Combinatorial Explosion) 35 4.12 怪异解决方案(Oddball Solution) 35 第5章 模式导向的重构目录 37 5.1 重构的格式 37 5.2 本目录中引用的项目 38 5.2.1 XML Builder 39 5.2.2 HTML Parser 39 5.2.3 贷款风险计算程序 40 5.3 起点 40 5.4 学习顺序 41 第6章 创建 43 6.1 用Creation Method替换构造函数 44 6.1.1 动机 44 6.1.2 做法 46 6.1.3 示例 46 6.1.4 变体 51 6.2 将创建知识搬移到Factory 52 6.2.1 动机 53 6.2.2 做法 55 6.2.3 示例 56 6.3 用Factory封装类 61 6.3.1 动机 62 6.3.2 做法 63 6.3.3 示例 63 6.3.4 变体 66 6.4 用Factory Method引入多态创建 68 6.4.1 动机 68 6.4.2 做法 69 6.4.3 示例 71 6.5 用Builder封装Composite 74 6.5.1 做法 76 6.5.2 示例 77 6.5.3 变体 87 6.6 内联Singleton 90 6.6.1 动机 90 6.6.2 做法 92 6.6.3 示例 93 第7章 简化 97 7.1 组合方法 98 7.1.1 动机 98 7.1.2 做法 100 7.1.3 示例 100 7.2 用Strategy替换条件逻辑 103 7.2.1 动机 103 7.2.2 做法 105 7.2.3 示例 106 7.3 将装饰功能搬移到Decorator 115 7.3.1 动机 115 7.3.2 做法 119 7.3.3 示例 120 7.4 用State替换状态改变条件语句 134 7.4.1 动机 134 7.4.2 做法 135 7.4.3 示例 136 7.5 用Composite替换隐含树 144 7.5.1 动机 144 7.5.2 做法 147 7.5.3 示例 148 7.6 用Command替换条件调度程序 155 7.6.1 动机 156 7.6.2 做法 157 7.6.3 示例 158 第8章 泛化 165 8.1 形成Template Method 166 8.1.1 动机 167 8.1.2 做法 168 8.1.3 示例 168 8.2 提取Composite 173 8.2.1 动机 173 8.2.2 做法 174 8.2.3 示例 175 8.3 用Composite替换一/多之分 181 8.3.1 动机 181 8.3.2 做法 183 8.3.3 示例 184 8.4 用Observer替换硬编码的通知 191 8.4.1 动机 191 8.4.2 做法 192 8.4.3 示例 193 8.5 通过Adapter统一接口 200 8.5.1 动机 200 8.5.2 做法 201 8.5.3 示例 202 8.6 提取Adapter 209 8.6.1 动机 209 8.6.2 做法 211 8.6.3 示例 211 8.6.4 变体 217 8.7 用Interpreter替换隐式语言 218 8.7.1 动机 218 8.7.2 做法 220 8.7.3 示例 221 第9章 保护 231 9.1 用类替换类型代码 232 9.1.1 动机 232 9.1.2 做法 234 9.1.3 示例 235 9.2 用Singleton限制实例化 240 9.2.1 动机 240 9.2.2 做法 241 9.2.3 示例 241 9.3 引入Null Object 243 9.3.1 动机 244 9.3.2 做法 245 9.3.3 示例 246 第10章 聚集操作 251 10.1 将聚集操作搬移到Collecting Parameter 252 10.1.1 动机 252 10.1.2 做法 253 10.1.3 示例 254 10.2 将聚集操作搬移到Visitor 258 10.2.1 动机 258 10.2.2 做法 262 10.2.3 示例 266 第11章 实用重构 273 11.1 链构造函数 274 11.1.1 动机 274 11.1.2 做法 275 11.1.3 示例 275 11.2 统一接口 277 11.2.1 动机 277 11.2.2 做法 278 11.2.3 示例 278 11.3 提取参数 279 11.3.1 动机 279 11.3.2 做法 279 11.3.3 示例 280 跋 281 参考文献 283 索引 287

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧