控制台程序。

Obserable类提供了一个有趣的机制,可以把类对象中发生的改变通知给许多其他类对象。

对于可以观察的对象来说,类定义中需要使用java.util.Observable类。只需要简单地从Observable类派生出要监控对象所属的类即可。

用于观察器的类要实现Observer接口,只需要定义方法update()即可。这个方法在对应的Observable对象发生变化时调用。传送给update()方法的第一个参数是对Observable对象的引用,Observable对象发生了变化并导致调用update()方法。这样一来,Observer观察器对象就可以访问Observable对象中的公共方法,从而访问要显示的数据。update()方法的第二个参数把其他信息传送给Observer对象。

首先为可以显示变化的对象定义一个类:

 import java.util.Observable;

 public class JekyllAndHyde extends Observable {
public void drinkPotion() {
name = "Mr.Hyde";
setChanged();
notifyObservers();
} public String getName() {
return name;
} private String name = "Dr. Jekyll";
}

现在,给观察这些变化的人定义一个类:

 import java.util.Observer;
import java.util.Observable; public class Person implements Observer {
// Constructor
public Person(String name, String says) {
this.name = name;
this.says = says;
} // Called when observing an object that changes
public void update(Observable thing, Object o) {
System.out.println("It's " + ((JekyllAndHyde)thing).getName() + "\n" + name + ": " + says);
} private String name; // Person's identity
private String says; // What they say when startled
}

用下面的类可以让一些观察者观察Dr.Jekyll:

 // Try out observers
import java.util.Observer; public class Horrific {
public static void main(String[] args) {
JekyllAndHyde man = new JekyllAndHyde(); // Create Dr. Jekyll Observer[] crowd = {
new Person("Officer","What's all this then?"),
new Person("Eileen Backwards", "Oh, no, it's horrible those teeth!"),
new Person("Phil McCavity", "I'm your local dentist here's my card."),
new Person("Slim Sagebrush", "What in tarnation's goin'on here?"),
new Person("Freaky Weirdo", "Real cool, man. Where can I get that stuff?")
}; // Add the observers
for(Observer observer : crowd) {
man.addObserver(observer);
}
man.drinkPotion(); // Dr. Jekyll drinks up
}
}

对man对象调用drinkPotion()方法会导致内部名称被改变,调用man对象的setChang()方法,在调用从Obxervable类继承的notifyObservers()方法。这会对每个已注册的观察期调用update()方法以生成输出。

最新文章

  1. 过滤eWebeditor等富文本中html标签,获得纯文本信息
  2. 安装numpy+mkl
  3. oracle中,拼接的字符串给游标赋值
  4. 学习web前端开发感想
  5. 将cocos2dx项目从Visual Studio 迁移到 xcode
  6. 黑马程序员——Foundation之NSString和NSMutableString
  7. windows批量创建用户
  8. 学习ios设计(1)
  9. J Dp
  10. mongodb3 ubuntu离线安装(非apt-get)及用户管理
  11. CodePath Android CliffNotes 之 Effective Java for Android 翻译
  12. webpack 4.X 基础编译
  13. HTML5开发之meta标签的viewport使用说明
  14. 51Nod1253 Kundu and Tree 容斥原理
  15. 【转】让你彻底搞懂websocket
  16. Java并发编程的艺术(五)——中断
  17. 配置Hadoop1.2.1
  18. LeetCode包括main函数的答题框架(Java+Eclipse)
  19. ZOJ 2971 Give Me the Number (模拟,字符数组的清空+map)
  20. python正则表达式函数match()和search()的区别详解

热门文章

  1. 龙珠 超宇宙 [Dragon Ball Xenoverse]
  2. number_format函数的使用
  3. wordpress页面前端添加编辑按钮
  4. mybatis 中#{}与${}的区别 (面试题)
  5. C# .Net实现URL绝对路径和相对路径之间互相转换
  6. 002_base64的编码实现
  7. JS框架比较
  8. 【Java 基础篇】【第四课】初识类
  9. angularJS自定义属性作为条件中转
  10. Solr分页与高亮(使用SolrNet实现)