观察者模式是一个广播机制的基础,实现1对N的联动,当1发生变化,N跟着相应变化,由此衍生了发布订阅模式,其方式分两种,①强制推送:当1发生变化,强制N也跟着发生变化,②拉的方式,即N方可以自己决定是否接收,只有当N这方有需要时才去获取最新的,不然就算1方变化,N这方也不更新。

观察者接口和具体实现类:

/***观察者接口*/
public interface Observer {void update(Subject subject);//观察者接收一个推送过来的主题}//============================/***观察者具体实现类*/
public class ObserverImpl implements Observer {private int state; //拥有与主体一致的状态,用于接收订阅的主题内容 public int getState() {return state;}public void setState(int state) {this.state = state;}@Overridepublic void update(Subject subject) {this.state=((ConcreteSubject)subject).getState();//在具体观察者中进行同步状态更新}}

主题基类和主题具体类

/*** 主体的基类,定义了一些公用方法,没有具体主题,也可以定义成抽象类*/
public class Subject {public List<Observer> list=new ArrayList<Observer>();//在主体方定义一个容器存放注册的观察者public void registerObserver(Observer obs){list.add(obs);//注册观察者,即把需要订阅的观察者加进容器中}public void removeObserver(Observer obs){list.remove(obs);//移除观察者}//主题发生变化时,通知所有观察者进行更新public void notifyAllObservers(List<Observer> list){for (Observer observer : list) {observer.update(this);}}}//=================================================/***有具体主题的子类*/
public class ConcreteSubject extends Subject {private int state;//模拟一个具体主题public int getState() {return state;}public void setState(int state) {this.state = state;this.notifyAllObservers(list);//此步为关键,当主题发生变化时,主题中注册的观察者的状态也跟着进行更新}   }

客户端调用:

     public static void main(String[] args) {ConcreteSubject concreteSubject = new ConcreteSubject();//目标主题,发布者ObserverImpl observer1=new ObserverImpl();ObserverImpl observer2=new ObserverImpl();ObserverImpl observer3=new ObserverImpl();concreteSubject.registerObserver(observer1);//注册观察者concreteSubject.registerObserver(observer2);concreteSubject.registerObserver(observer3); concreteSubject.setState(1000);//目标主题状态为1000System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//观察者的值也都为1000concreteSubject.setState(2000);//目标主题状态值发生改变System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//观察者的值也改为2000}

以上代码是自己实现的观察者模式,实际上JavaSE中已经为我们提供了实现观察者模式的基础,java.util.Observable类和java.util.Observer接口,通过这两个对象可以方便的实现观察者模式,java.util.Observable相当于上面定义的Subject,Observable中定义好了一些常用的方法来添加观察者,移除观察者等,观察者只要实现Observer接口就具有观察者身份,可以被添加进来。  

/*** 继承JDK的Observable类实现主题*/
public class ConcreteSubject extends Observable{private int state;public int getState() {return state;}public void setState(int state) {this.state = state;super.setChanged();//当次属性发生改变时,调用基类的setChanged()方法表示当前观察者有改变,//主要改变super.hasChanged()方法返回值,观察者可以通过此值判断目标对象是否已改变super.notifyObservers(this.state);//把当前发生改变的对象通知各个观察者}
}//===================================================/***实现JDK的观察者接口,实现更新方法*/
public class ObserverImpl implements Observer {private int state;   public int getState() {return state;}public void setState(int state) {this.state = state;}@Overridepublic void update(Observable o, Object obj) {setState(((ConcreteSubject)o).getState());//this.state =Integer.parseInt((String)obj);//也可以直接通过传递过来的参数赋值}
}//==================================================public static void main(String[] args) {ConcreteSubject subject=new ConcreteSubject();ObserverImpl observer1=new ObserverImpl();ObserverImpl observer2=new ObserverImpl();ObserverImpl observer3=new ObserverImpl();subject.addObserver(observer1);subject.addObserver(observer2);subject.addObserver(observer3);subject.setState(10);System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//观察者的值也都为1000subject.setState(2000);//目标主题状态值发生改变System.out.println(observer1.getState());System.out.println(observer2.getState());System.out.println(observer3.getState());//观察者的值也改为2000}

JavaEE中监听器就使用的是观察者模式

  

转载于:https://www.cnblogs.com/javabg/p/7443399.html

设计模式系列之----观察者模式相关推荐

  1. Java 23种设计模式系列之观察者模式(常用)

    目录 观察者(Observer)模式 定义: 优点: 缺点: 注意事项: 使用场景: 结构: 结构图: 模式的简单实现: 抽象观察者(Observer) 具体观察者(ConcrereObserver) ...

  2. Javascript乱弹设计模式系列(1) - 观察者模式(Observer)

    前言 博客园谈设计模式的文章很多,我也受益匪浅,包括TerryLee.吕震宇等等的.NET设计模式系列文章,强烈推荐.对于我,擅长于前台代码的开发,对于设计模式也有一定的了解,于是我想结合Javasc ...

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

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

  4. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十五 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  5. 极速理解设计模式系列【目录索引】

    这是一个老生常谈的设计模式系列文章,本系列力图从最简洁的语言和最易理解的实例来让大家认识设计模式的思想和思路,从而在实际项目中能够用到一二.现在将本系列文章详列如下: 极速理解设计模式系列:1.建造者 ...

  6. .NET设计模式系列文章

    .NET设计模式系列文章 最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来写,可是写到今天,设计模式带给我的震撼,以及许多初学者朋友的热心支持,让我下定决心要把这个系列写完写 ...

  7. 收藏:TerryLee的.NET设计模式系列文章

    正打算就设计模式的学习写点什么,到cnblogs一查发现关于设计模式的系列已经有很多了,就免了.看了一下数TerryLee的系列写的易懂,将目录收藏在此. .NET设计模式系列文章 http://te ...

  8. javascript设计模式系列 - LukeLin - 博客园

    javascript设计模式系列 创建型: 1.抽象工厂模式(Abstract Factory) 2.构建者模式(Builder) 3.工厂方法模式(Factory Method) 4.原型模式(Pr ...

  9. 设计模式系列-代理模式

    为什么80%的码农都做不了架构师?>>>    一.上篇回顾 很久没有更新设计模式系列的文章了,有了很多热心朋友的反馈,我决定继续将这个系列赶快写完,最近由于过年了,有很多相关的事宜 ...

最新文章

  1. 直播实录QA | 王赟Maigo分享“知识连成一片”是怎样一种体验
  2. 【开放书】《命令行数据科学指南(第二版)》
  3. str()和repre()的区别
  4. *PAT_B_1052_C++(20分)
  5. php ldap支付,php – 实现LDAP合规性
  6. 程序员常挂在嘴边的10句话:刚刚还是好的啊!
  7. Python《爬取各种帅哥图片》
  8. bzoj1046 [HAOI2007]上升序列
  9. BZOJ 2039 人员雇佣 (最小割)
  10. hls和modelsim联合仿真生成波形找不到wlf文件
  11. fstatfs/statfs详解
  12. 碎片知识总结_刷题篇
  13. 固态硬盘用软件测试掉速严重,SSD固态硬盘掉速怎么办?手动执行TRIM指令缓解固态硬盘掉速方法...
  14. Linux shell脚本文件的各种执行方式
  15. python--实现汇率转换
  16. Early stopping conditioned on metric `val_loss` which is not available. Available metrics are: loss,
  17. win10无线网卡无法连接网络
  18. mysql获取年月日周季度
  19. 使用软路由实现智能Qos
  20. YOLOV3解读(3)

热门文章

  1. Sublime P4语法高亮设置
  2. scrapy笔记——python的时间转换
  3. 【案例】常驻查询引发的thread pool 性能问题之二
  4. 于ubuntu配置hadoop当问题
  5. Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图
  6. Application failure. hr=0x80040101:Failed to initialize virtual machine.
  7. JUC多线程核心知识-思维导图
  8. 1131: 零起点学算法38——求阶乘和
  9. 让PHP更快的提供文件下载
  10. linux下ssh登录PIX防火墙