MyException - 我的异常网
当前位置:我的异常网» 设计模式 » 【2013.2.15】设计形式C++ 实现——Observer

【2013.2.15】设计形式C++ 实现——Observer

www.MyException.Cn  网友分享于:2013-02-20  浏览:2次
【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。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有