观察者模式

意图

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新

适用性

1、当一个抽象模型有两个方面,其中一个依赖另外一个

2、当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对吸纳个有待改变

3、当一个对象那个必须通知其他对象,而它又不能假定其他对象是谁,换言之,你不希望这些对象时紧密耦合的

结构

Subject

目标知道他的观察者。可以有任意多的观察者观察同一个目标

提供注册和删除观察者对象的接口

Observer

为那些在目标发生变化时需要被通知的对象定义一个更新接口

ConcreteSubject

将有关状态存入各ConcreteObserver对象

当他的状态发生改变时,向他的各个观察者发出通知

ConcreteObserver

维护一个指向ConcreteSubject对象的引用

存储有关状态,这些状态应与目标状态保持一致

是想Observer的更新接口以使自身状态与目标状态保持一致

实现

现在,我们有一个游戏,一共有5个角色,当前是其中有一个角色被攻击的时候,通知其他角色,并且其他角色对其作出反应

package observer;/*** @Author fitz.bai* @Date 2018/9/6 20:50*/
public interface Observer {String getName();void setName(String name);void help(); //update();void beAttacked(ControlCenter controlCenter);
}
package observer;/*** @Author fitz.bai* @Date 2018/9/6 21:03*/
public class Player implements Observer {private String name;public Player(String name) {this.name = name;}@Overridepublic String getName() {return name;}@Overridepublic void setName(String name) {this.name = name;}@Overridepublic void help() {System.out.println(this.name + "--lei了,他lei了");}@Overridepublic void beAttacked(ControlCenter controlCenter) {System.out.println(this.name + "正受到攻击!");controlCenter.notifyObservers(name);}
}
package observer;import java.util.ArrayList;
import java.util.List;/*** @Author fitz.bai* @Date 2018/9/6 20:52*/
abstract class ControlCenter {protected String name;protected List<Observer> players = new ArrayList<>();public String getName() {return name;}public void setName(String name) {this.name = name;}public void attach(Observer observer) {System.out.println(observer.getName() + "加入了游戏!");players.add(observer);}public void detach(Observer observer) {System.out.println(observer.getName() + ",你走吧!我们能赢!");players.remove(observer);}public abstract void notifyObservers(String name);
}
package observer;/*** @Author fitz.bai* @Date 2018/9/6 20:58*/
public class LGDControlCenter extends ControlCenter {@Overridepublic void notifyObservers(String name) {System.out.println("队友呢?队友呢?队友呢?队友呢?队友呢?");for (Observer o : players) {if (!o.getName().equalsIgnoreCase(name)) {o.help();}}}
}
package observer;import iterator.ConcreteList;/*** @Author fitz.bai* @Date 2018/9/6 20:50*/
public class Client {public static void main(String[] args) {ControlCenter controlCenter =  new LGDControlCenter();Observer player1, player2, player3, player4, player5;player1 =new Player("船长");controlCenter.attach(player1);player2 =new Player("PA");controlCenter.attach(player2);player3 =new Player("SPE");controlCenter.attach(player3);player4 =new Player("AM");controlCenter.attach(player4);player5 =new Player("WR");controlCenter.attach(player5);System.out.println("=============有玩家推出了游戏===================");player1.beAttacked(controlCenter);controlCenter.detach(player1);player2.beAttacked(controlCenter);}
}
/**船长加入了游戏!
PA加入了游戏!
SPE加入了游戏!
AM加入了游戏!
WR加入了游戏!
船长正受到攻击!
队友呢?队友呢?队友呢?队友呢?队友呢?
PA--lei了,他lei了
SPE--lei了,他lei了
AM--lei了,他lei了
WR--lei了,他lei了
=============有玩家退出了游戏===================
船长,你走吧!我们能赢!
PA正受到攻击!
队友呢?队友呢?队友呢?队友呢?队友呢?
SPE--lei了,他lei了
AM--lei了,他lei了
WR--lei了,他lei了
*/

总结

其实观察者模式很简单,可以简单理解为,有一个对象关联着其他未知数目的对象,当这个对象发生变化时,通知其他对象,其他对象那个做出相应反应

加入对象A为被观察的对象,它维持着一众仰慕者他的对象B,当对象A发生变化时,他会调用内部的notify方法通知他的仰慕者们,在每一个对象B中呢,维护一个指向对象A的引用,当A变化时就调用update方法作出反应

MVC

MVC(Model-View-Controller)架构中也应用了观察者模式,其中模型(Model)可对应于观察者模式中的观察目标,而视图(View)对应于观察者,控制器(Controller)可充当两者之间的中介者。当模型层的数据发生改变时,视图层将自动改变其显示内容。

优点

1、可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色

2、 观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察目标只需要维持一个抽象观察者的集合,无须了解其具体观察者。由于观察目标和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次

3、观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度

(4) 增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便,满足“开闭原则”的要求

缺点

1、如果一个观察目标对象有很多直接和间接观察者,将所有的观察者都通知到会花费很多时间。

2、如果在观察者和观察目标之间存在循环依赖,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

Java设计模式19:观察者模式(Observer)相关推荐

  1. 设计模式:观察者模式--Observer

    一.什么是观察者模式 1.生活中的观察者模式 1.警察抓小偷 在现实生活中,警察抓小偷是一个典型的观察者模式「这以一个惯犯在街道逛街然后被抓为例子」,这里小偷就是被观察者,各个干警就是观察者,干警时时 ...

  2. java 观察者模式_图解Java设计模式之观察者模式

    图解Java设计模式之观察者模式 天气预报项目需求 天气预报设计方案 1 - 普通方案 观察者模式(Observer)原理 观察者模式解决天气预报需求 观察者模式在JDK应用的源码分析 天气预报项目需 ...

  3. Java设计模式系列--观察者模式(使用)

    原文网址:Java设计模式系列--观察者模式(使用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的用法. 观察者模式的含义 以微信公众号为例.我们关注了某个微信公众号后能收 ...

  4. Java设计模式之观察者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  5. java设计模式 观察者模式_理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...

  6. Java 设计模式之观察者模式

    一.了解观察者模式 1.1 什么是观察者模式 观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新. 典型的问题比如报社,只要你是他们的订户,他们 ...

  7. 设计模式学习--观察者模式(Observer Pattern)

    设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一 ...

  8. 锈才学设计模式之 —— 观察者模式(Observer Pattern)

    锈才学设计模式之  -- 观察者模式 观察者模式:定义对象的一对多的关系,这样当主题对象改变状态时,其它的观察者对象都会收到通知,自动更新. 说明: 在真实世界中存在很多类似的模型,比如:订报纸,找中 ...

  9. (设计模式十三)java设计模式之观察者模式

    特别说明:本篇博客来自于设计模式菜鸟教程 观察者模式 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern).比如,当一个对象被修改时,则会自动通知它的依赖对象.观察者模式属于 ...

  10. 设计模式初探-观察者模式(OBSERVER)又称发布-订阅(Publish-Subscribe)依赖(Dependents)

    观察者模式(OBSERVER),又称发布-订阅(Publish-Subscribe),依赖(Dependents),通过定义对象间的一对多的依赖关系,达到当一个对象的状态发生改变时,所有依赖于它的对象 ...

最新文章

  1. numpy 中 tile 的用法
  2. HTML-CSS背景渐进色
  3. 战网服务器修改 win8,如何修改战网客户端?修改战网客户端的方法
  4. 郑州智慧岛大数据管委会_数据科学融通应用数学 ‖ 智慧岛大讲堂
  5. javascript从url中获取请求参数
  6. PostgreSQL 连接的问题
  7. 用python数据分析来解密新经济(IT桔子)死亡公司的内幕
  8. html图片下载链接怎么弄_html 导入图片
  9. 内存条hyperx_一键开启内存条最高效能 HyperX雷电系列3733MHz内存条评测
  10. 雨林风一键重装系统_u盘启动盘制作工具-雨林风
  11. 中国抗生素产业运行状况与需求前景规模预测报告2022版
  12. 2015-2016 Petrozavodsk Winter Training Camp, Moscow SU Trinity Contest
  13. 怎么在contenteditable可编辑的div插入图片
  14. 突然讨厌做前端,讨厌代码_如何安全清洁讨厌的游戏控制器
  15. 没有公网IP,3个路由器就能解决连锁视频监控
  16. 计算机保研备战,【计算机系】“研途有你 更为明朗”计算机系2017级考研/保研交流会...
  17. ldap-安装及配置2
  18. TinyProject -- Easy BeatBox (Head First Java Version)
  19. 曝光以租场地名义的新型合同诈骗伎俩
  20. 漫步者W820NB拆解及声学性能测试

热门文章

  1. linux 启用dhcp服务器,linux下DHCP服务器配置
  2. 引用 《金枝欲孽》精彩台词
  3. python 中sample是什么_Python中random.sample和random.shuffle的区别是什么
  4. .avi文件转为.mp4
  5. 堆糖瀑布流完整解决方案(jQuery)
  6. Unity简单2D游戏开发
  7. Java解压缩技术(三)BZIP2压缩-解压缩
  8. Android AccountManager 账户同步管理简单介绍
  9. 出击BI SAP推全新业务分析应用行业软件
  10. 0~6岁儿童不同时期微量元素含量的结果分析