引例:银行现在的业务大多有提醒业务,比如我们用信用卡消费的时候银行会有短信通知和Email通知等方法立即提醒客户账户发生了变化。这就是典型的Observer模式,A(账户)发生变化之后通知B(手机)和C(Email),以后也许还会通知D(电话)等等。。。程序设计中也会遇到很多这样的问题,比如说MFC中的Document/View架构,Document中的数据变化会立即通知View的显示也相应变化,View的显示变化后也会通知Document中的数据产生对应变化;再比如回调函数,触发某个事件后通知调用回调函数。但凡“通知依赖”问题大都可以用到Observer模式。动机:为某些对象建立“通知依赖关系”——“一个对象的状态发生改变,那么与之相关的所有对象都要改变”。显然这种关系是紧耦合的,为保证这种结构在遇到变化时能够比较稳定,我们必须使之松耦合。意图:定义对象间的一种一对多关系,以便当一个对象的状态发生改变时,所有依赖它的对象都得到通知和自动更新(GoF23)设计思路:我们的目的是在A的状态发生改变时会自动通知B,上下两幅图分别代表了两个设计的方法。上图是一种较容易想到的解决方法,但是可以看出A依赖于B,两者是紧耦合关系。OO中有一个重要的原则就是“依赖倒置原则”,于是就有了下图:接口IA依赖于接口IB,而IA和IB是从A,B中抽象出来的相对稳定的部分,IA和IB之间的依赖关系相对稳定,不易变化。Ok,就是这么简单!Observer模式的思想就是这样!问题的关键在于如何抽象IA和IB,下面是GoF23对Observer模式描述的UML图其中Subject即接口IA,Observer即接口IB。Observer只有一个方法Update,用于更新具体的Observer。Subject一般有一个List用于保存Observer的信息;Attach负责添加Observer;Detach负责删除Observer;Notify通知List中的所有Observer调用Update。
posted on 2009-04-05 22:51 Alex@VCC 阅读(1732) 评论(3) 编辑 收藏 引用 所属分类: 设计模式
非常感谢!设计模式其实非常重要,希望斑竹出更多更好的设计模式的文章。 回复 更多评论
牛人太多了..... 回复 更多评论
楼主这么写 不合逻辑吧?BankAcount 不保存用户信息?class BankAccount:public Isubject{public: void notify(account &person){ for(vector<Iobserver*>::iterator it=Observer.begin();it!=Observer.end();it++){ (*it)->update(person); } } BankAccount(int num,string str){ add(new email); add(new phone); person.email=str; person.phonename=num; } void withdraw(){ // account one={1,"2"}; notify(person); }private: account person;}; 回复 更多评论
Powered by: C++博客 Copyright © Alex@VCC