设计模式之第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

  <。)#)))≦ 

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

  1. 设计模式之第15章-适配器模式(Java实现)

    设计模式之第15章-适配器模式(Java实现) “呔,来着何人,报上名来.”“这是谁啊,我怎么没见过”,“就是啊,我也没印象.”“我当然是适配器了,要不然还能是谁.”适配器模式碎碎念:我不就是昨天把你 ...

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

    设计模式之第4章-装饰模式(Java实现) “怎么了,鱼哥?” “唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个X,邮的 ...

  3. 设计模式之第0章-单例模式(Java实现)

    设计模式之第0章-单例模式(Java实现) 当当当当~首先有请最简单的单例模式登场,先来个自我介绍吧 单例模式之自我介绍 我,单例模式(Singleton Pattern)是一个比较简单的模式,我的定 ...

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

    设计模式之第3章-模板方法模式(Java实现) "那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了...这个那个".这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场) ...

  5. 设计模式之第2章-抽象工厂模式(Java实现)

    设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...

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

    设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...

  7. [head first 设计模式]第二章 观察者模式

    [head first 设计模式]第二章 观察者模式 假如我们有一个开发需求--建造一个气象观测站展示系统.需求方给我们提供了一个WeatherObject对象,能够自动获得最新的测量数据.而我们要建 ...

  8. Java 第18章 多态

    18 章  --> 多态 继承: extends 抽象类 abstract (限制类的实例化) 抽象方法 public abstract void show(); //抽象方法只有方法的声明,没 ...

  9. Head First 设计模式 第2章 观察者模式

    第2章.观察者模式 1.定义: 在对象之间定义一对多关系,当一个对象改变状态时,该对象的依赖会收到通知,并自动更新. 2.介绍 在介绍观察者模式之前,先来说一个日常生活中经常碰到的事(可能现在的人碰到 ...

随机推荐

  1. css动画-小球撞壁反弹

    小球碰到一面壁之后一般都会反弹,反射角=入射角: 其实用css3来实现这个效果也非常简单. 首先,分解一下小球的运动:水平运动和垂直运动. 当小球往右下方向运动时,如果碰到了下面的壁,那么由于碰撞,小 ...

  2. hibernate笔记4--qbc查询

    Criteria:是一种完全面向对象的查询方式,Criteria查询也叫做qbc查询(query by Criteria).         查询全部,分页查询,统计查询,条件查询,排序查询,离线查询 ...

  3. redis---安全设置

    redis的安全性是通过设置口令来实现的. 首先打开redis的配置文件,我的是在/etc/redis/redis.conf,个人的路径可能会有不同,可以自行查找. 打开redis.conf文件以后, ...

  4. Cypress测试工具

    参考博客:  https://testerhome.com/articles/19035 最近一段时间学习了cypress的测试工具, 她是一个端到端的测试web工具. 环境准备 1.工具:vs co ...

  5. Azure School,让系统化学习回归一站式的简单体验

    承认吧,「终身制学习」已经成为一个不可抵挡的趋势.不管你从事什么行业,几乎已经没有什么可以一直吃老本就能搞定的事情,总有各种新的技术和概念等着你去学.至于发展速度飞快的IT 技术,不断的学习更是贯彻始 ...

  6. Localroast使用总结

    全手打原创,转载请标明出处: https://www.cnblogs.com/dreamsqin/p/10883248.html,多谢~=.= 什么是Localroast 一个根据 JSON 文件快速 ...

  7. 用JavaScript访问SAP云平台上的服务遇到跨域问题该怎么办

    关于JavaScript的跨域问题(Cross Domain)的讨论, 网上有太多的资源了.国内的程序猿写了非常多的优秀文章,Jerry这里就不再重复了. 直入主题,最近我正在做一个原型开发:通过SA ...

  8. 如何修改集群的公网信息(包括 VIP) (文档 ID 1674442.1)

    适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.3 到 12.1.0.2 [发行版 11.2 到 12.1]本文档所含信息适用于所有平台 用 ...

  9. 2018.5.14 XML文档类型定义----DTD

    1.DTD概述 一个完全意义上的XML文件不仅仅是Well-fromed(格式良好的),而且还应该是使用了一些自定义的标记ValidatingXMl(有效的)文档也就是说他必须遵守文档类型的定义中已声 ...

  10. SQLAlchemy简介

    一.SQLAlchemy简介 SQLAlchemy是Python SQL工具包和对象关系映射器,是python中最著名的ORM(Object Relationship Mapping)框架,它简化了应 ...