设计模式--观察者模式

1、观察者模式

观察者模式:定义对象间一种一对多的依赖关系,当一个对象状态发生变化时,所有依赖于它的对象都得到通知,并被自动更新。

2、观察者模式的结构

  • 角色

    • 主题(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如添加,删除观察者以及通知观察者的方法。

    • 观察者(ObServer): 观察者是一个接口,该接口规定了具体观察者用来获得数据的方法。

    • 具体主题(ConcreteSubject):具体主题是实现主题接口的类的一个实例,该实例包含观察者关心的数据,而且这些数据可能经常发生变化。具体主题需要使用一个集合来存放观察者的引用,以便数据变化时通知具体的观察者。

    • 具体观察者(ConreteObserver):具体观察者是实现观察者接口的类的一个实例。具体观察者包含具体主题的引用,以便让具体主题将自己添加到具体主题的集合中,使自己成为具体主题的观察者,或者从具体主题的集合中将自己删除,不成为具体主题的观察者。

  • UML图

  

3、观察者模式举例

 主题接口:Subject.java

<Observer>

 观察者接口:Observer.java

1 package com.nick.pattern.observer;2 /**3  * @ 观察者接口4  * @author nick5  */6 public interface Observer {7     void response(); //相当于update()方法 8 }

 具体主题类:Cat.java

1 package com.nick.pattern.observer; 2  3 import java.util.ArrayList; 4  5 /** 6  * @ 具体主题:猫(老鼠和狗是观察者,他们通过观察猫的行为,做出反应) 7  * @author nick 8  * 9  */10 public class Cat implements Subject {11     ArrayList<Observer> observers = new ArrayList<Observer>();12     13     @Override14     public void attach(Observer obs) {15         observers.add(obs);16     }17 18     @Override19     public void detach(Observer obs) {20         observers.remove(obs);
21     }22 23     @Override24     public void cry() {    //通知方法25         System.out.print("猫叫:");26         System.out.println("喵喵喵");27         for(Observer obs:observers) {28             obs.response();29         }30     }31 }

具体观察者:Dog.java

1 package com.nick.pattern.observer; 2 /** 3  * @ 具体观察者: 狗 4  * @author nick 5  * 6  */ 7 public class Dog  implements Observer{ 8  9     @Override10     public void response() {11         System.out.print("狗叫:");12         System.out.println("汪汪汪");13     }14 15 }

具体观察者:Mouse.java

1 package com.nick.pattern.observer; 2 /** 3  * @ 具体观察者:老鼠 4  * @author nick 5  * 6  */ 7 public class Mouse implements Observer{ 8  9     @Override10     public void response() {11         System.out.print("老鼠跑:");12         System.out.println("跑跑跑");13     }14 15 }

主程序:Application.java

1 package com.nick.pattern.observer; 2 /** 3  * @ 主程序 4  * @author nick 5  * 6  */ 7 public class Application { 8  9     public static void main(String[] args) {10             Subject cat = new Cat();11             Observer dog = new Dog();12             Observer mouse = new Mouse();13             cat.attach(dog);14             cat.attach(mouse);15             16             cat.cry();//触发通知方法17     }18 19 }

运行结果:

  

4、观察者模式的优缺点

  • 优点1: 具体主题和观察者是松耦合的关系。由于主题接口仅仅依赖与观察者接口,因此具体主题只是知道他的观察者是实现观察者接口的某个类的实例,但不需要知道是哪个类。

  • 优点2:具体观察者只需要知道它依赖的主题是实现主题接口的某个实例即可,不需要知道具体是哪个类。

  • 优点3:观察者模式满足“开-闭”原则。主题接口(Subject)仅仅依赖于观察者接口(Observer)。这样具体主题的类也仅仅依赖于观察者接口,增加新的实现观察者接口的类,不必修改创建具体主题的类的代码:

    •   新增加一个观察者Pig.java

    • 1 package com.nick.pattern.observer; 2 /** 3  * @ 新增的观察者Pig 4  * @author nick 5  */ 6 public class Pig implements Observer{ 7  8     @Override 9     public void response() {10         System.out.println("猪叫:");11         System.out.println("咯咯咯");12     }13 14 }
    • 只需要在主程序中添加这两行代码

(0)

相关推荐

  • 通俗易懂系列 | 设计模式(七):观察者模式

    介绍# 观察者模式是行为设计模式之一.当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用.在观察者模式中,监视另一个对象状态的对象称为Observer,正在被监视的对象称为S ...

  • 行为型模式之观察者模式

    在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变.例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心. 在软件世界也是这样,例如 ...

  • JAVA设计模式之观察者模式 - Observer

    有趣的事情发生时,可千万别错过了!有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事.对象甚至在运行时可决定是否要继续被通知.有了观察者,你将会消息灵通. 介绍 观察者模式的定义: 在对象之间 ...

  • PHP设计模式之观察者模式

    PHP设计模式之观察者模式 观察者,貌似在很多科幻作品中都会有这个角色的出现.比如我很喜欢的一部美剧<危机边缘>,在这个剧集中,观察者不停的穿越时空记录着各种各样的人或事.但是,设计模式中 ...

  • PHP设计模式—观察者模式

    定义: 观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 结构: Eve ...

  • 设计模式之观察者模式

    设计模式之观察者模式

  • 简说设计模式——观察者模式

    一.什么是观察者模式 观察者一般可以看做是第三者,比如在学校上自习的时候,大家肯定都有过交头接耳.各种玩耍的经历,这时总会有一个"放风"的小伙伴,当老师即将出现时及时"通 ...

  • 结合JDK源码看设计模式——观察者模式

    前言: 现在我们生活中已经离不开微信,QQ等交流软件,这对于我们来说不仅是交流,更有在朋友圈中或空间中进行分享自己的生活,同时也可以通过这个渠道知道别人的生活.我们在看朋友圈的时候其实我们扮演的就是一 ...

  • [PHP小课堂]PHP设计模式之观察者模式

    [PHP小课堂]PHP设计模式之观察者模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 设计模式(20) 观察者模式

    观察者模式是一种平时接触较多的模式.它主要用于一对多的通知发布机制,当一个对象发生改变时自动通知其他对象,其他对象便做出相应的反应,同时保证了被观察对象与观察对象之间没有直接的依赖. GOF对观察者模 ...

  • 无废话设计模式(15)行为型模式--观察者模式

    0-前言 观察者模式定义:定义了一种一对多的依赖关系让多个观察者对象同事监听某一主题对象. 这个主题对象在状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己: 1-实现 1-1.简单UML图 ...

  • 软件设计模式修炼 -- 观察者模式

    观察者模式是一种经常使用的设计模式,在软件系统中对象并不是孤立存在的,一个对象行为的改变可能会导致其他与之存在依赖关系的对象行为发生改变,观察者模式用于描述对象之间的依赖关系. 模式动机 很多情况下, ...

  • 图解Java设计模式之观察者模式

    天气预报项目需求 1)气象站可以将每天测量到的湿度.温度.气压等等以公告的形式发布出去(比如发布到自己的网站或第三方). 2)需要设计开放型API,便于其他第三方也能接入气象站获取数据. 3)提供温度 ...