一.基本概念
   java.util.Observable 被观察者类,需要继承这个类
   java.util.Observer 观察者类,需要实现这个接口中的update()方法

二.举例 Door2
   属性 name 和status 改变,被监管
1.Door2

import java.util.Observable;

//被监管对象
public class Door2 extends Observable {
private String state = "";
private String name = ""; public void setState(String newValue) {
if (state != newValue) {
this.state = newValue;
// 标记此 Observable对象为已改变的对象
setChanged();
// 通知所有观察者
notifyObservers("state");
}
} public void setName(String newValue) {
if (name != newValue) {
this.name = newValue;
// 标记此 Observable对象为已改变的对象
setChanged();
// 通知所有观察者
notifyObservers("name");
}
}
//////////////////////////////////////////
public String getName() {
return name;
} public String getState() {
return state;
}
}

2.被监管对象
   Door2StateObserver

import java.util.Observable;
import java.util.Observer; public class Door2StateObserver implements Observer { @Override
public void update(Observable o, Object arg) {
Door2 door2 = (Door2) o;
if (!arg.toString().equalsIgnoreCase("state")) {
return;
}
switch (door2.getState()) { // 使用Java 7的switch语句对string的判断支持
case "open":
System.out.println("门打开");
break;
case "close":
System.out.println("门关闭");
break;
}
}
}

Door2NameObserver

import java.util.Observable;
import java.util.Observer; public class Door2NameObserver implements Observer { @Override
public void update(Observable o, Object arg) {
Door2 door2 = (Door2) o;
if (!arg.toString().equalsIgnoreCase("name")) {
return;
}
System.out.println("I got a new name,named \"" + door2.getName() + "\"");
}
}

3.Door2Test

public class Door2Test {
public static void main(String[] args) { Door2 door = new Door2();
Observer stateListener = new Door2StateObserver();
door.addObserver(stateListener);
// 开门
door.setState("open");
System.out.println("我已经进来了");
// 关门
door.setState("close"); //
Observer nameListener = new Door2NameObserver();
door.addObserver(nameListener);
door.setName("dengzy");
}
}

设计模式_Observable与Observer的更多相关文章

  1. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  2. 8.5 GOF设计模式四: 观察者模式Observer

    GOF设计模式四: 观察者模式Observer  现实中遇到的问题  当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式  观察者模式 ...

  3. java设计模式解析(1) Observer观察者模式

      设计模式系列文章 java设计模式解析(1) Observer观察者模式 java设计模式解析(2) Proxy代理模式 java设计模式解析(3) Factory工厂模式 java设计模式解析( ...

  4. 深入浅出设计模式——观察者模式(Observer Pattern)

    模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而 ...

  5. c++ 设计模式5 (Observer / Event 观察者模式)

    3.3 观察者模式 (Observer)/发布-订阅模式 动机: 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都能得 ...

  6. [设计模式] 19 观察者模式 Observer Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.当一个 ...

  7. Java设计模式模式观测(Observer Pattern)

    Observer Pattern 设计模式通常用于.这是一个事件侦听器模型. 该模型有两个作用,一个是Subject, 有一个Observer.Subject 保存多个Observer参考,一旦一个特 ...

  8. 设计模式之观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  9. c#设计模式之观察者模式(Observer Pattern)

    场景出发 一个月高风黑的晚上,突然传来了尖锐的猫叫,宁静被彻底打破,狗开始吠了,大人醒了,婴儿哭了,小偷跑了 这个过程,如果用面向对象语言来描述,简单莫过于下: public class Cat { ...

随机推荐

  1. Netty游戏服务器二

    上节我们写个server主类,那么发现什么事情都干不了,是的,我们还没有做任何的业务处理. 接着我们开始写处理客户端连接,发送接收数据的类ServerHandler. public class Ser ...

  2. Windows DiskPart工具使用

    启动工具 diskpart 列出磁盘列表 list disk 选择磁盘 select disk 1 转换为GPT分区 convert gpt 列出分区 list partition 清除所有分区 cl ...

  3. [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化

    Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...

  4. Walle代码发布系统

    Walle 一个web部署系统工具,配置简单.功能完善.界面流畅.开箱即用!支持git.svn版本管理,支持各种web代码发布,PHP,Python,JAVA等代码的发布.回滚,可以通过web来一键完 ...

  5. Git系列三之GitHub使用方法

    GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub. GitHub 于 2008 年 4 月 10 日正式上线,除了 Git 代 ...

  6. js 中小数取整的函数

    1.丢弃小数部分,保留整数部分 js:parseInt(7/2) 2.向上取整,有小数就整数部分加1 js: Math.ceil(7/2) 3,四舍五入. js: Math.round(7/2) 4, ...

  7. js 实现存储Map 结构的数据

    <script type="text/javascript"> function Map() { var struct = function(key, value) { ...

  8. maven 编码GBK的不可映射字符 或者 UTF-8

    要通过修改pom.xml文件,告诉maven这个项目使用UTF-8来编译. 方案一: 在pom.xml的/project/build/plugins/下的编译插件声明中加入下面的配置:<enco ...

  9. 在Eclipse中点击ctrl+h打开搜索界面,范围指定的项目中搜索包含person的文件

    ctrl+h ===>File Search Tab ===>在containing text里输入person,scope ==>selected resources,搜索就可以了

  10. 详解php的魔术方法__get()和__set()

    先看看php官方文档的解释:__set() is run when writing data to inaccessible properties.__get() is utilized for re ...