设计模式之GOF23观察者模式
观察者模式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();
}
}
void update();
}
class ObserverA implements Observer{
private int myState;
private Subject sub;
public ObserverA(Subject sub) {
this.sub = sub;
}
public void update() {
myState=((ConcreteSub)sub).getState();
System.out.println("状态已更新");
}
}
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);
}
}

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;
}
}
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 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观察者模式的更多相关文章
- 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)
设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...
- Java设计模式之《观察者模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6513651.html 观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监 ...
- Java设计模式百例 - 观察者模式
观察者(Observer)模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,主体对象的状态变化会通知所有观察者对象.观察者模式又叫做发布-订阅(Publish/Subscribe ...
- [head first 设计模式]第二章 观察者模式
[head first 设计模式]第二章 观察者模式 假如我们有一个开发需求--建造一个气象观测站展示系统.需求方给我们提供了一个WeatherObject对象,能够自动获得最新的测量数据.而我们要建 ...
- Java设计模式10:观察者模式
观察者模式 观察者模式也叫作发布-订阅模式,也就是事件监听机制.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使他 ...
- 大话设计模式C++版——观察者模式
观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式. 这里以大话设计模式中的例子为例,办公室员工A.B.C在 ...
- 【C++深入浅出】设计模式学习之观察者模式
前言 前两天学习了weak_ptr以后还是不甚明了,一则需要实际应用去锤炼,二来就是不懂观察者模式. 正文 观察者模式又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对 ...
- php设计模式之:观察者模式
转载自php面向对象设计模式 之 观察者模式 问题 假如一个小贩, 他把产品的价格提升了, 不同的消费者会对此产生不同的反应.一般的编程模式无非是获取提升的价格,然后获取所有的消费者,再循环每个消费者 ...
- 我理解设计模式C++实现观察者模式Observer Pattern
概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...
随机推荐
- J - Recommendations CodeForces - 1315D
https://blog.csdn.net/w_udixixi/article/details/104479288 大意:n个数,每个数只能向上加,a[i]+1需要的时间是t[i],求使这n个数无重复 ...
- 快速搭建网站信息库(小型Zoomeye)
前言:本来是不想重复造车轮的,网上资料有开源的fofa,和一些设计.有的架设太复杂了,好用东西不会用,整个毛线.还有的没有完整代码. 设计方案: 测试平台:windows 测试环境:php ...
- Gatling脚本编写技巧篇(二)
脚本示例: import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.durati ...
- Python中Selenium模拟JQuery滑动解锁实例
滑动解锁一直做UI自动化的难点之一,我补一篇滑动解锁的例子,希望能给初做Web UI自动化测试的同学一些思路. 首先先看个例子. https://www.helloweba.com/demo/2017 ...
- Dockerfile的简单人门编写之关于yum的问题
首先我们编写一个简单的Dockerfile的例子.不过再此之前大家得去把编写dockerfile的指令了解一下. 编写以 centos镜像为基础镜像,构建 http 服务,Dockerfile 要求删 ...
- Java中的字符串操作(比较String,StringBuiler和StringBuffer)
一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...
- INDIRECT函数实现动态图表的跨数据抓取
涉及函数: indirect函数:通常有两种用法.直接指定单元格地址和隐式指定单元格地址.直接指定:=indirect("A4"),则会返回A4单元格所显示的内容.参数给定的既是字 ...
- c++ 更新 performance counter 数据,错误码 87
ERROR_INVALID_PARAMETER 87 (0x57) The parameter is incorrect. 很可能是该送 ULONG 的送了 ULONGLONG,vise versa
- 用Python来揭秘吃瓜群众是如何看待罗志祥事件的
前言 最近娱乐圈可以说得上是热闹非凡,前有霸道总裁爱小三,正宫撕逼网红女,后有阳光大男孩罗志祥,被周扬青扒的名声扫地.贵圈的爱情故事,常人是难以理解的,正如贾旭明张康这段相声所说的这样,娱乐圈的爱情总 ...
- mysql查询连接数
最近公司的测试服务器数据库经常是连接爆满,几次加大了依旧满了. 明明只有几个人在用这个数据库,但是连接数到了三四百.于是就想是谁一直开着连接不释放,于是写了个SQL查了下连接使用情况. SQL如下: ...