观察者模式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. 7.关于一些dom&&获取元素

    1. 测试点击的是否是span 标签 <span onClick={this.select.bind(this)}>点击</span>   select( e ){  cons ...

  2. 3.k均值的算法

    一.课堂练习 # 课堂练习 from sklearn.datasets import load_iris # 导入鸢尾花数据 iris=load_iris() iris iris.keys() dat ...

  3. 详解封装源码包成RPM包

    源码编译安装是最常用安装软件方式,可是面对工作量巨大时候就需要我们的RPM包上场了,统一的模块,一键安装.在面对一定数量的服务器上,RPM就可以为我们节省大量的时间. RPM可以在网上下载,但是当我们 ...

  4. 2019-2020-1 20199325《Linux内核原理与分析》第一周作业

    1.显示一句话welcome !/bin/bash script4-1.sht var1="welcome to use Shell script" echo $var1 pwd ...

  5. Zookeeper之Error contacting service. It is probably not running.

    安装ZooKeeper时,无论是修改zoo.cfg:还是myid,都检查了几遍都没有错误.但是开启Zookeeper服务时出现: Error contacting service. It is pro ...

  6. ajax无刷新上传和下载

    关于ajax无刷新上传和下载 这是一个没什么含量但是又用的比较多又不得不说的问题,其实真的不想说,因为没什么好说的. 关于上传 1.使用Flash,ActiveX 上传 ,略... 2.自己写XMLH ...

  7. 数据开源工具:Hadoop为企业带来什么?

    熟悉大数据的人一定不会对大名鼎鼎的Hadoop工具陌生,Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序.Hadoop的框架最核 ...

  8. 二.Spring boot食用指南:结合Jpa(Hibernate) 构建MVC架构

    1.POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...

  9. java集合的简单用法

    typora-root-url: iamge [TOC] 1.集合接口 1.1将集合的接口与实现分离 ​ 与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(im ...

  10. 中国AI觉醒 阿里王坚:云智能将成为大趋势

    2019独角兽企业重金招聘Python工程师标准>>> <麻省理工科技评论>新兴科技峰会EmTech China于北京召开.大会中,其中一项热门的讨论便是:中国和美国的科 ...