观察者模式Observer

广播机制

场景:多个观察者--被通知改变

CS的时候,人物移动坐标变化,更新每个人地图上的坐标

核心:当目标对象(Subject)的状态值改变时,需要及时告知所有观察者(Observer),使他们做出响应

开发中常见的场景:

-聊天室程序中,服务器转发给所有客户端

-网络游戏(多人联机)中,服务器将各个玩家的状态分发

-邮件订阅

-Servlet中,监听机制

-Android中的广播机制

-JDK的AWT中事件处理模型,基于观察者模式的委派事件模型(Delegation Event Model)(事件源------目标对象,事件监听器------观察者)

-京东商城中,群发商品打折信息

public class Subject {
 //被观察者队伍
  protected List<Observer> observers=new ArrayList<>();
  public void addObserver(Observer obs) {
   observers.add(obs);
  }
  public void removeObserver(Observer obs) {
   observers.remove(obs);
  }
  //通知所有被观察者的状态更新
  public void notifyAllObserve() {
   for(Observer obs:observers) {
    obs.update();
   }
  }
}
class ConcreteSub extends Subject{
 private int state;
 public int getState() {
  return state;
 }
 public void setState(int state) {
  this.state = state;
  this.notifyAllObserve();
 }
}

public interface Observer {
  void update();
}
class ObserverA implements Observer{
 private int myState;
 private Subject sub;
 public ObserverA(Subject sub) {
  this.sub = sub;
 }
 @Override
 public void update() {
  myState=((ConcreteSub)sub).getState();
  System.out.println("状态已更新");
 }
 
}
public class Client {
public static void main(String[] args) {
 ConcreteSub sub=new ConcreteSub();
 ObserverA obs1=new ObserverA(sub);
 ObserverA obs2=new ObserverA(sub);
 ObserverA obs3=new ObserverA(sub);
 //添加到被观察者队伍
 sub.addObserver(obs1);
 sub.addObserver(obs2);
 sub.addObserver(obs3);
 
 sub.setState(1000);
}
}
#####################################手动分隔符##############################################
java.util.Observable(相当于上面定义的Subject类)和java.util.Observer(相当于上面定义的Observer接口)
public class ConcreteSubject extends Observable{
  private int state;
  public void set(int s) {
   state=s;
   setChanged();
   this.notifyObservers();
  }
public int getState() {
 return state;
}
public void setState(int state) {
 this.state = state;
}
 
}
public class ObserverA implements Observer{
  private int myState;
 @Override
 public void update(Observable o, Object arg) {
  myState=((ConcreteSubject)o).getState();
 }
 public int getMyState() {
  return myState;
 }
 public void setMyState(int myState) {
  this.myState = myState;
 }
 
}
public class Client {
public static void main(String[] args) {
 ConcreteSubject cs=new ConcreteSubject();
 ObserverA obs1=new ObserverA();
 ObserverA obs2=new ObserverA();
 ObserverA obs3=new ObserverA();
 //添加至队伍中
 cs.addObserver(obs1);
 cs.addObserver(obs2);
 cs.addObserver(obs3);
 
 cs.set(100);
 
 System.out.println(obs1.getMyState());
 System.out.println(obs2.getMyState());
 System.out.println(obs2.getMyState());
 
}
}

设计模式之GOF23观察者模式的更多相关文章

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

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

  2. Java设计模式之《观察者模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6513651.html 观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监 ...

  3. Java设计模式百例 - 观察者模式

    观察者(Observer)模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,主体对象的状态变化会通知所有观察者对象.观察者模式又叫做发布-订阅(Publish/Subscribe ...

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

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

  5. Java设计模式10:观察者模式

    观察者模式 观察者模式也叫作发布-订阅模式,也就是事件监听机制.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使他 ...

  6. 大话设计模式C++版——观察者模式

    观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式.    这里以大话设计模式中的例子为例,办公室员工A.B.C在 ...

  7. 【C++深入浅出】设计模式学习之观察者模式

    前言 前两天学习了weak_ptr以后还是不甚明了,一则需要实际应用去锤炼,二来就是不懂观察者模式. 正文 观察者模式又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对 ...

  8. php设计模式之:观察者模式

    转载自php面向对象设计模式 之 观察者模式 问题 假如一个小贩, 他把产品的价格提升了, 不同的消费者会对此产生不同的反应.一般的编程模式无非是获取提升的价格,然后获取所有的消费者,再循环每个消费者 ...

  9. 我理解设计模式C++实现观察者模式Observer Pattern

    概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...

随机推荐

  1. Django开发文档-域用户集成登录

    项目概述: 一般在企业中,用户以WINDOWS的域用户统一的管理,所以以Django快速开发的应用,不得不集成AD域登录. 网上一般采用django-python3-ldap的库来做集成登录,但是本方 ...

  2. 【转】动态规划之最长公共子序列(LCS)

    [原文链接]最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经典的面试题目,因为它的解法是典型的二维动态规划,大部分比较困难的字符串问题都和这个问题一个套 ...

  3. 什么是LVM

    LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性.前面 ...

  4. java学习(第一篇)

    Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正式 ...

  5. Linux系统进入救援模式

    由于现在很多的服务器都是用的RedHat,CentOS也比较多,这里就介绍CentOS6.6的救援模式. 有很多人的linux在用的时候不小心修改了某个权限,导致系统启动不起来,下面我就来为大家解决一 ...

  6. 二进制安装MySQL及破解密码

    二进制安装MySQL及破解密码 1.确保系统中有依赖的libaio 软件,如果没有: yum -y install libaio 2.解压二进制MySQL软件包 tar xf mysql-5.7.24 ...

  7. js 实现对象的混合与克隆效果,带完整版解析代码[helpers.js]

    前言:         本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽.         本篇文章为您分析一下原生JS写淘宝无缝轮播图效果 对象混合 ...

  8. 什么是.pyc文件

    1. Python是一门解释型语言? Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在. 如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled ...

  9. lua 发送http请求

    lua发送http请求,luajit默认没有http.lua库,需要下载并存放到luajit对应目录. 一.下载http.lua和http_headers.lua库 参考:https://www.zi ...

  10. C语言编程入门题目--No.10

    题目:打印楼梯,同时在楼梯上方打印两个笑脸. 1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数. 2.程序源代码: #include "stdio.h" ...