【2013.2.15】设计模式C++ 实现——Observer
// // // // // // // // //
///2013.2.15
// // // // // // // // //
如果要给设计模式按照难易程度评级别的话,
之前的设计模式大多是一星或一星半(当然,也有部分原因是我没有深入)。
但是今天要讲的这个设计模式,
难度应该是三星(Not samsung :-P)。
但与此相比,
其实用性却是五星级别的。
因为无所不在的MVC结构(Model/View/Control),
就是这个设计模式最好的实例。
当然,
因为本文的面向对象是初学者,
故笔者在这里不打算使用MVC作为讲解。
不过如果想要了解更多关于MVC,请戳这里。
除此之外,
这个设计模式还有一个别名——发布/订阅模式。
运气不错,
我之前学习的《C#3.0设计模式》一书中就是使用这个例子来进行模式拆分讲解的:
最简单的形容就是网页中的RSS订阅了,
不过话说在这个时代这种订阅模式已经不再风靡,
取而代之的是微博2.0时代。
众所周知,
微博中我们每个人都是博主的同时也是粉丝。
我们可以关注别人,
也可以被关注。
从粉丝角度来讲,
每一个粉丝都是一个观察者(Observer),
他们都会订阅(关注)你(的微博),
当他们关注你的时候,
你将他们放到一个粉丝列表之中——我们称之为Attach,
然后在这个粉丝列表中,
每一次你发一条新微博(更新一次状态),
在这个粉丝列表中的人都将接收到这条通知(显示在微博消息中),
这个过程我们称之为Notify,
然而当他发现你有时候会刷屏的时候,
会很生气,
于是决定将你取消关注——我们称之为Detach。
于是他也将从你的粉丝列表中消失,
这样当你再次发送新微博的时候,
他将不再接收。
【核心】订阅者订阅发布者的发布(请连续念三遍,是不是会不经意间说出布丁布丁?;-P)。
UML图:
不得不讲解一下这张UML图:
首先是请大家注意Observer左边的那个小星星,
代表Subject类中包含Observer集合(数个对象)。
Subject的三个接口及其对应关系如下:
Attach——新增观察者到Observer集合中。
Detach——将已存在观察者移除。
Notify——利用Observer对象的Update来通知本Subject已经发生变化。
ConcreteSubject类中的Set/GetState用于设置/获取此Subject的状态。
除此之外,
为什么会有两个ConcreteObserver(A/B)呢?
因为这是为了表明此模式适用于Subject具有多个观察者类别的情形。
比如说你的粉丝A与粉丝B不可能是同一个账号吧?
这样每个ConcreteObserver都会拥有自己的Update。