设计模式之第18章-观察者模式(Java实现)

设计模式之第18章-观察者模式(Java实现)

  话说曾小贤,也就是陈赫这些天有些火,那么这些明星最怕的,同样最喜欢的是什么呢?没错,就是狗仔队。英文的名字比较有意思,是paparazzo,这一说法据说来自意大利电影《滴露牡丹开》中一个专门偷拍明星照片的一个摄影师的名字,“Paparazzo”,中文译为帕帕拉齐,俗语就是狗仔队。这些明星因狗仔队而荣,获得曝光率,也因狗仔队而损,被曝光负面新闻,不管怎么说,总之是“火起来了”,让明星们又爱又恨。(众人:鱼哥,你扯远了)。咳咳,这个狗仔队其实嘛,也就是所谓进行监视观察活动,接下来就让观察者来给我们讲讲观察者与设计模式不得不说的那些个事儿。

观察者模式之自我介绍

  额就四(我就是)观察者,也被称作依赖或者发布订阅,是在项目中经常用到的一种模式。定义如下:Define a one-to-many dependency between objects so that when one objects changes state, all its dependents are notified and updated automatically.翻译过来就是说:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。观察者的通用类图如下:

  

观察者模式之自我分析

  首先来说下好处:

  • 支持广播通信。
  • 目标和观察者之间抽象耦合。

  接着是缺点部分:

  • 因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。
  • 然后又是效率问题了,开发效率以及运行效率方面都有可能存在问题,一个被观察者,多个观察者,开发调试比较复杂,而且一个观察者卡壳,其它观察者也会被影响。
  • 另外多级触发的效率也需要考虑到。

观察者模式之实现

  至于实现那么就以“贱人曽”来举个栗子吧。就拿曾小贤来举栗子(贤哥,我不是有意的,不要怪我撒,我知道你是LOLer,打得还不错),首先是被观察者Observable,就是名人,比如说曽大大,习大大,Linus大大等等:

1 public interface Obeservable{
2     //增加观察者
3     public void addObserver(Observer observer);
4     //删除观察者
5     public void deleteObserver(Observer observer);
6     //发生改变通知观察者
7     public void notifyObservers(String context);
8 }

  这个是通用的观察者接口,所有的观察者都可以实现这个接口,接下来是小贤的接口:

1 public interface IZengXiaoXian{
2     //吃饭
3     public void eat();
4     //睡觉
5     public void sleep();
6     //玩
7     public void play();
8 }

  小贤的接口包含3个活动,吃饭、睡觉、打豆豆,啊,口滑了,是玩耍,娱乐活动,比如说和子萱出去玩耍了之类的,下面是具体的小贤的实现类:

 1 public class ZengXiaoXian implements IZengXiaoXian,Obserable{
 2     //定义动态数组存放不同媒体的狗仔队
 3     private ArrayList<Observer> observerList = new ArrayList<>();
 4     //增加观察者
 5     public void addObserver(Observer observer){
 6         this.observerList.add(observer);
 7     }
 8     //删除观察者
 9     public void deleteObserver(Observer observer){
10         this.observerList.remove(observer);
11     }
12     //发生改变通知观察者
13     public void notifyObservers(String context){
14         for (Observer observer : observerList ) {
15             observer.update(context);
16         }
17     }
18     //吃饭
19     public void eat(){
20         System.out.println("曾小贤要吃饭了");
21         this.notifyObservers("曾小贤要吃饭了");
22     }
23     //睡觉
24     public void sleep(){
25         System.out.println("曾小贤要睡觉了");
26         this.notifyObservers("曾小贤要睡觉了");
27     }
28     //玩
29     public void play(){
30         System.out.println("曾小贤要玩耍了");
31         this.notifyObservers("曾小贤要玩耍了");
32     }
33 }

  被观察者已经实现了,然后是观察者的实现,首先依然是观察者的接口:

1 public interface Observer{
2     //发现被观察的人有动静,就开始准备写稿子,整头条什么的
3     public void update(String context);
4 }

  然后就是狗仔队的实现了,狗仔队一号出动:

 1 public class Paparazzo1 implements Observer{
 2     //狗仔队一号一旦发现有什么爆料,就告诉老板
 3     public void update(String str){
 4         System.out.println("观察到曾小贤和张子萱拥吻,开始汇报");
 5         this.reportToXX(str);
 6     }
 7     //汇报给XX媒体
 8     private void reportToXX(String context){
 9         System.out.println("老大,我看到"+context);
10     }
11 }

  如果你还想要其它狗仔队请自行实现Paparazzo2、3等等等等,那么我们用一个场景类来实现当时的现场情况:

 1 public class Client{
 2     public static void main(String[] args) {
 3         //出来一个狗仔队
 4         Observer paparazzo = new Paparazzo();
 5
 6         //曾小贤出场
 7         ZengXiaoXian zengxiaoxian = new ZengXiaoXian();
 8         zengxiaoxian.addObserver(paparazzo);
 9
10         //看看曾小贤在干嘛
11         zengxiaoxian.eat();
12         zengxiaoxian.play();
13         zengxiaoxian.sleep();
14     }
15 }

  好了,基本实现就是这样子了。

观察者模式之应用场景

  当你遇到以下任意一种情况,可以考虑使用额来实现:

  • 当一个抽象模型有两个方面,其中一个依赖于另一个方面。
  • 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。

  这个时候就轮到我登场了,狗仔队就是额,额就四狗仔队,噢耶。“动二动二,我是动幺,这里有一名疑似精神病院跑出来的患者,赶紧给予抓捕带回”,“鱼哥,救额,额不是精神病,你快告诉他们。”(作者按:少一个了,这样以后就少一个人和我抢零食了。默默离开)。金坷垃刺秦王,设计模式任我闯。

  PS:本博客欢迎转发,但请注明博客地址及作者~

  博客地址:http://www.cnblogs.com/voidy/

  博客新址:http://voidy.net

  <。)#)))≦ 

时间: 2024-10-12 14:14:31

设计模式之第18章-观察者模式(Java实现)的相关文章

设计模式之第4章-装饰模式(Java实现)

设计模式之第4章-装饰模式(Java实现) “怎么了,鱼哥?” “唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个X,邮的却是一个X的,不说了,退货去.你先开讲吧,你说说就一个东西还装饰个什么劲儿.”(装饰模式石化中:这关我什么事儿撒.)恩,今天由我来讲,讲之前先来个段子:话说面条被追到一个理发店,出来一个方便面,然后追他的人一把抓住他就开打:小子(第四声),烫个头发我就不认识你了么?其实那人认错了,出来的真的是方便面

《javascript 设计模式》 第15章 观察者模式 -- 学习笔记

定义: 在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式(又名发布者-订阅者 “publisher-subscriber" 模式) 是一种管理人与其任务之间的关系(确切的讲,是其对象及其行为和状态之间的关系 )的得力工具.用javascript的 话来说,这种模式的实质 就是你可以程序中某个对象的状态进行观察并且在其发生改变时能够得到通知. 观察者API: var Publisher=function(){ this.subscribers=[]; } //推送方法 Pub

大话设计模式第十四章--观察者模式

<?php abstract class Subject { private $_observers = array(); public function attach(Observer $observer) { $this->_observers[] = $observer; } public function detach(Observer $observer) { if (isset($this->_observers[$observer])) { unset($this->

设计模式之第3章-模板方法模式(Java实现)

设计模式之第3章-模板方法模式(Java实现) "那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了...这个那个".这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场).由美女抽象工厂介绍一下适用场景~大家欢迎 抽象工厂之应用场景 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想显示它们的接口而不是实现时. “人家要讲的就这么多了,接下来还是让今

设计模式之第1章-工厂方法模式(Java实现)

设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~).“抽象工厂模式,赶紧的自我介绍,工厂方法模式,你身为男人,要懂得绅士风度,lady first懂不懂,稍后再来,急什么.”(画外音:鱼哥,这是我家祖传的小吃,还有我爹的好酒blablabla),“哎呀,那个抽象工厂模式,阿姨喊你回家吃饭了.”“哦,我去去就回,等我啊.”工厂方法,赶紧的.“等等,

设计模式之第6章-迭代器模式(Java实现)

设计模式之第6章-迭代器模式(Java实现) “我已经过时了,就不要讲了吧,现在java自带有迭代器,还有什么好讲的呢?”“虽然已经有了,但是具体细节呢?知道实现机理岂不美哉?”“好吧好吧.”(迭代器闷闷不乐的答应下来.作者吃着小笼包,咂咂嘴道:哼,想偷懒,窗户都没有~). 迭代器模式之自我介绍 正如你们所见,我目前已经没落了,基本上没人会单独写一个迭代器,除非是产品性质的研发,我的定义如下:Provide a way to access the elements of an aggregate

大话设计模式_观察者模式(Java代码)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们自己能够自动更新自己.简单描述:1个Subject类(可以是抽象类可以是接口),可以有多个具体Subject类(继承抽象Subject),此具体Subject持有多个观察者的引用,在此具体Subject状态发生变化的时候调用这些观察者的相应方法.另外,这些持有的引用是抽象的,不是具体的,而这些引用所指向的对象时具体的观察者(即需要作出更新的具体观察者,这些具体

设计模式之第22章-组合模式(Java实现)

设计模式之第22章-组合模式(Java实现) “鱼哥,有没有什么模式是用来处理树形的“部分与整体”的层次结构的啊.”“当然”“没有?”“有啊.别急,一会人就到了.” 组合模式之自我介绍 “请问你是?怎么什么都不说就直接上来了.”“本式行不更名坐不改姓,就是组合模式来着,此次受作者之邀来讲讲我的前世今生来着.”“哦,你就是组合模式啊,久仰久仰.”“失敬失敬.”恩,首先我先说下定义:Compose objects into tree structure to represent part-whole

设计模式之第12章-享元模式(Java实现)

设计模式之第12章-享元模式(Java实现) “怎么回事,竟然出现了OutOfMemory的错误.鱼哥,来帮我看看啊.”“有跟踪错误原因么?是内存泄露么?”“不是内存泄露啊,具体原因不知道啊.对了,有说新对象申请不到内存空间.”“这个原因么,我曾写过一篇博文:叫OutOfMemory简单分析.不过你的明显是因为代码问题,产生对象太多,导致内存被耗尽,正好一会有堂课,讲的正好能解决你的问题.”(嘿嘿,轮到我享元模式出场了~) 享元模式之自我介绍 我,享元模式乃是池技术中的重要实现方式,具体定义如下