【GOF23设计模式】观察者模式
来源:http://www.bjsxt.com/
一、【GOF23设计模式】_观察者模式、广播机制、消息订阅、网络游戏对战原理
package com.test.observer; import java.util.ArrayList;
import java.util.List; public class Subject {
protected List<Observer> list = new ArrayList<Observer>(); public void registerObserver(Observer obs){
list.add(obs);
}
public void removeObserver(Observer obs){
list.remove(obs);
} //通知所有的观察者更新状态
public void notjfyAllObservers(){
for (Observer obs : list) {
obs.update(this);
}
}
}
package com.test.observer; public class ConcreteSubject extends Subject{
private int state; public int getState() {
return state;
} public void setState(int state) {
this.state = state;
//主题对象(目标对象)的值发生了变化,请通知所有的观察者
this.notjfyAllObservers();
}
}
package com.test.observer; public interface Observer {
void update(Subject subject);
}
package com.test.observer; public class ObserverA implements Observer{
private int myState;//myState需要跟目标对象的state值保持一致 public int getMyState() {
return myState;
} public void setMyState(int myState) {
this.myState = myState;
} @Override
public void update(Subject subject) {
myState = ((ConcreteSubject)subject).getState();
}
}
package com.test.observer; public class Client {
public static void main(String[] args) {
//目标对象
ConcreteSubject subject = new ConcreteSubject(); //创建多个观察者
ObserverA obs1 = new ObserverA();
ObserverA obs2 = new ObserverA();
ObserverA obs3 = new ObserverA(); //将这三个观察者添加到subject对象的观察者队伍中
subject.registerObserver(obs1);
subject.registerObserver(obs2);
subject.registerObserver(obs3); //改变subject的状态
subject.setState(3000);
System.out.println("#################");
//我们看看,观察者的状态是不是也发生了变化
System.out.println(obs1.getMyState());
System.out.println(obs2.getMyState());
System.out.println(obs3.getMyState()); //改变subject的状态
subject.setState(30);
System.out.println("#################");
//我们看看,观察者的状态是不是也发生了变化
System.out.println(obs1.getMyState());
System.out.println(obs2.getMyState());
System.out.println(obs3.getMyState());
}
}
控制台输出:
#################
3000
3000
3000
#################
30
30
30
二、【GOF23设计模式】_观察者模式、obserable类和observer接口、应用场景总结
package com.test.observer2; import java.util.Observable;
/**
* 目标对象
*/
public class ConcreteSubject extends Observable{
private int state; public int getState() {
return state;
} public void setState(int state) {
this.state = state;
} public void set(int s){
state = s; //目标对象的状态发生了改变 setChanged(); //表示目标对象已经做了更改
notifyObservers(state); //通知所有的观察者
}
}
package com.test.observer2; import java.util.Observable;
import java.util.Observer; public class ObserverA implements Observer{
private int myState; public int getMyState() {
return myState;
} public void setMyState(int myState) {
this.myState = myState;
} @Override
public void update(Observable o, Object arg) {
myState = ((ConcreteSubject)o).getState();
}
}
package com.test.observer2; public class Client {
public static void main(String[] args) {
//创建目标对象Obserable
ConcreteSubject subject = new ConcreteSubject(); //创建观察者
ObserverA obs1 = new ObserverA();
ObserverA obs2 = new ObserverA();
ObserverA obs3 = new ObserverA(); //将上面三个观察者对象添加到目标对象subject的观察者容器中
subject.addObserver(obs1);
subject.addObserver(obs2);
subject.addObserver(obs3); //改变subject对象的状态
subject.set(3000);
System.out.println("==================状态修改了");
//观察者的状态发生了变化
System.out.println(obs1.getMyState());
System.out.println(obs2.getMyState());
System.out.println(obs3.getMyState()); //改变subject对象的状态
subject.set(600);
System.out.println("==================状态修改了");
//观察者的状态发生了变化
System.out.println(obs1.getMyState());
System.out.println(obs2.getMyState());
System.out.println(obs3.getMyState());
}
}
控制台输出:
==================状态修改了
3000
3000
3000
==================状态修改了
600
600
600
【GOF23设计模式】观察者模式的更多相关文章
- 【GOF23设计模式】工厂模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_简单工厂模式详解.面向对象设计原则.开闭原则.依赖反转原则.迪米特法则 没有工厂模式的情况 package com.te ...
- 【GOF23设计模式】单例模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_单例模式.应用场景.饿汉式.懒汉式 1.GOF23设计模式 2.单例模式 3.饿汉式 1 package com.t ...
- 【GOF23设计模式】备忘录模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_备忘录模式.多点备忘.事务操作.回滚数据底层架构 package com.test.memento; /** * 源发器类 ...
- 18. 星际争霸之php设计模式--观察者模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 【GOF23设计模式】状态模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_状态模式.UML状态图.酒店系统房间状态.线程对象状态切换 package com.test.state; public ...
- 【GOF23设计模式】模板方法模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_模板方法模式.钩子函数.方法回调.好莱坞原则 package com.test.templateMethod; publi ...
- 【GOF23设计模式】策略模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_策略模式.CRM中报价策略.GUI编程中布局管理器底层架构 package com.test.strategy; /** ...
- 【GOF23设计模式】解释器模式 & 访问者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_解释器模式.访问者模式.数学表达式动态解析库式 1.解释器模式Interpreter 2.访问者模式Visitor
- 【GOF23设计模式】命令模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_命令模式.数据库事务机制底层架构实现.撤销和回复 package com.test.command; public cla ...
随机推荐
- android rectF
new Rect(left , top, right , bottom) 这个构造方法需要四个参数这四个参数 指明了什么位置 ?我们就来解释怎么画 这个 矩形 这四个 参数 分别代表的意思是:left ...
- 什么才是正确的javascript数组检测方式
前面的话 对于确定某个对象是不是数组,一直是数组的一个经典问题.本文专门将该问题择出来,介绍什么才是正确的javascript数组检测方式 typeof 首先,使用最常用的类型检测工具——typeof ...
- NYOJ 1023 还是回文(DP,花最少费用形成回文串)
/* 题意:给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费. 那么,将字符串变成回文串的最小花费是多少呢? 思路:如果一个字符串增加一个字符 x可以形成一个回文串,那么从这个字 ...
- Cocos2d-x 3.2 学习笔记(五)Sprite Node
游戏中最重要的元素Sprite精灵,关于精灵的创建,精灵的控制等等. 涉及到的类Class: AnimationFrame 动画帧. Animation 动画对象:一个用来在精灵对象上表现动画的动画对 ...
- 【web前端面试题整理05】做几道前端面试题休息休息吧
前言 连续学了两天javascript的东西了,我们都累了,于是今天还是上一套面试题吧,大家一起休息休息,也为下个星期可能会有的面试准备下. 题目一览 CSS1. overflow-x 属于 CS ...
- docker 1.8.2 源代码编译
编译docker的必要条件 这阵子在公司搞docker container这些技术,docker编译网上查了一下木有靠谱的.只好自己动手丰衣足食了. 声明:你编译docker不需要git pull它的 ...
- [Java 基础]运算符和表达式
Java运算符 (1)赋值操作符 赋值操作符(=)表示:取右边的值(即右值),把它复制给左边(即左值). 右值可以是任意的常量.变量或表达式(只要可以生成一个值). 左值必须是一个明确的.已命名的变量 ...
- web框架--flask
flask介绍 Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求 ...
- js文件合并,压缩,缓存,延迟加载
做web前段也有一段时间了,对于web中js文件的加载有些体会想跟大家一起分享一下. 1.首先说说js文件的合并和压缩吧 为了便于集中式管理js的合并和压缩我们创建一个Js.ashx文件来专门处理合并 ...
- Zip 压缩、解压技术在 HTML5 浏览器中的应用
JSZip 是一款可以创建.读取.修改 .zip 文件的 javaScript 工具.在 web 应用中,免不了需要从 web 服务器中获取资源,如果可以将所有的资源都合并到一个 .zip 文件中,这 ...