代码重构,用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),这样的耦合度太大了,但是我却不知道用什么好的方法可以解耦,望各位指点。
...全文
87 7 打赏 收藏 转发到动态 举报
写回复
用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 进行相应。。

5,531

社区成员

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

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