仓库风格之黑板风格

来源:互联网 发布:java 上传文件读取乱码 编辑:程序博客网 时间:2024/04/29 18:37

今天听班主任讲的《高级软件体系结构》后觉得里面有两个设计模式(观察者和黑板)让我很是感兴趣,主要是以前都看过但是都没有细细咀嚼就过了,今天就好好回味一下吧,呵呵~。

说到观察者模式,没有看过设计模式的人应该能够从字面找出一点线索出来,你可以先停下来想想会涉及到什么。观察者模式应该至少有两个对象,一个观察者、一个被观察者。那他们两个之间有什么关系呢?让我们先离开这个话题,回到现实生活中来吧。

人与人之间交流无时无刻不在利用观察者模式。我们就用两个人A和B说说吧,假设A与B本来在好好的说话,突然A性情大变对你大放厥词,这时我想B要么立马站起来予以抨击,或者脾气暴躁的会对A施展爷们活动。能够在生理和心理保持A性情没变之前的状态的人应该凤毛翎角。再打个比方,如果A在讲一个笑话或者是在表演一个搞笑的节目,我想B应该会被A的傻里傻气给逗乐的。从这两个例子就可以窥见,当被观察者的状态发生改变时,对观察者会产生一定的影响,从而促使观察者做出相应的动作。这就是观察者模式的核心思想。

好了,现在用一种不专业的手法理解了观察者模式后,那么如何从计算机语言层面去实现它呢?下面就用Java语言和UML图进行说明。

由于Java是一种面向对象的语言,它的基本构成就是对象,而对象又是通过类来实例化的。所以我们如果想要将观察者模式用Java实现的话,需要将观察者和被观察者用两个类来替代,在此将其对应的类命名为Observer和Observed。如我们前面所说被观察者需要有一种状态的改变,所以Observed类中需要定义一种状态属性,在此将以state命名的boolean类型的属性定义在Observed类中。接着一旦被观察者状态改变,观察者需要做出相应的动作,于是在Observe类中需要定义一个动作,在此命名为operation。再通过在被观察者中实例化一个Observe对象,通过这个对象来操作operation动作,从而达到被观察者状态的改变,观察者做出相应的改变的效果。如下UML图:

观察者和黑板模式


不知道大家有没有发现这个上面这个图中,Observed和Observer之间具有很强的耦合性,也就是Observed非常依赖Observer这个对象。回到现实中间来看这幅图好像他们就只能简简单单的表示A与B之间的关系。那么如果是老板在开会,底下一群员工在听报告,那么如何去把这一群员工用观察者表示出来了,显然一个具体的Observer类是不能够代表出不同的员工对象的。于是我们需要利用Java中的面向接口编程的方式将Observer类抽象成为接口,具体的观察者只要实现了这个接口就可以当成一个观察者了。同理观察者也不是仅仅只去观察一个被观察者,为了将他们之间相互解耦,同理也将被观察者抽象成为一个接口,让被观察者去实现,从而实现多对多的关系。大致的设计方法如下UML图,至于具体的实现可以自行参看《Java与模式》第38章。

 

观察者和黑板模式

 

接下来需要探讨黑板模式,在OSGi中也可以称为白板模式。知道我为什么对它有特别的爱好了吧,因为我研究OSGi有很长一段时间了,也在之前某个时间在某本书上看到过黑板模式,但是就是不理解它想表达的深层次意思。今天在课上班主任仅仅用了几句话,就让我茅塞顿开,所以我需要再回过头来好好整理一番。

老师打了个很形象的比方。黑板模式中肯定会有一个黑板之类的对象,然后有一群类似老师的人会在黑板上记录下自己的想法或者对某件事情的看法,老师同时可以对黑板上的不正确的东西进行改进,从而不断更新黑板上的东西。从而概括一点就是:有一定数量的对象对统一中央数据结构进行操作,从而实现中央数据结构的持续更新。同时在这里面还会涉及到一个控制器。

这里为了更好的理解黑板模式我又得打比方了。比如A观察了B、C、D、E、F这么多个对象,按照观察者模式,当B、C、D、E、F中某个对象状态改变时,通过初始化一个A对象然后利用A对象去调用operation操作。但是在黑板模式中是这样,B、C、D、E、F一旦状态改变,它会将其记录在一个类似黑板的统一中央数据中,然后A对象只需从黑板上关注自己的观察对象状态是否发生改变,一旦有改变则调用operation()操作。这两种方法中发生了一个微妙的改变,似乎黑板模式更好的解决了观察者与被观察者之间的耦合、依赖性。

        

如果想要更好的了解观察者模式和黑板模式,请参考《OSGi in action》4.13中的相关内容。

转自:http://blog.sina.com.cn/s/blog_7b3a171301011fh9.html#post


原创粉丝点击