控制台程序。

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()方法以生成输出。

Java基础之一组有用的类——Observable和Observer对象(Horrific)的更多相关文章

  1. Java基础之一组有用的类——为标记定义自己的模式(ScanString)

    控制台程序. Scanner类提供了一种方式,用来指定如何识别标记.这需要使用next()方法的两个重载版本.其中的一个版本接受Pattern类型的参数.另一个版本接受String类型的参数,用来指定 ...

  2. Java基础之一组有用的类——使用Scanner对象(TryScanner)

    控制台程序. java.util.Scanner类定义的对象使用正则表达式来扫描来自各种源的字符输入,并把输入显示为各种基本类型的一系列标记或者显示为字符串. 默认情况下,Scanner对象读取标记时 ...

  3. Java基础之一组有用的类——使用正则表达式搜索子字符串(TryRegex)

    控制台程序. 正则表达式只是一个字符串,描述了在其他字符串中搜索匹配的模式.但这不是被动地进行字符序列匹配,正则表达式其实是一个微型程序,用于一种特殊的计算机——状态机.状态机并不是真正的机器,而是软 ...

  4. Java基础之一组有用的类——使用公历日历(TryCalendar)

    控制台程序. 公历是西方使用的日历,用GregorianCalendar类的对象来表示.GregorianCalendar对象封装了时区信息.日期和时间数据.GregorianCalendar对象有7 ...

  5. Java基础之一组有用的类——生成日期和时间(TryDateFormats)

    控制台程序. java.util包中含有相当多的类涉及日期和时间,包括Date类.Calendar类和GregorianCalendar类. Date类对象其实定义了精确到毫秒的时刻,从1970年1月 ...

  6. Java基础之一组有用的类——使用二叉树搜索算法搜索某个作者(TryBinarySearch)

    控制台程序. Arrays类中的binarySearch()静态方法使用二叉树搜索算法,在有序数组中查找包含给定值的元素.只有当数组的元素按升序方式排序时,该方法才是最有效的,否则就应在调用binar ...

  7. Java基础之一组有用的类——使用比较器对数组排序(TrySortingWithComparator)

    控制台程序. Arrays类中的sort()静态方法把传送为参数的数组元素按升序方式排序. 对于第一个参数类型是Object[]的sort()方法来说,可以传送任意类型的数组.如果使用sort()方法 ...

  8. Java基础之一组有用的类——使用正则表达式查找和替换(SearchAndReplace)

    控制台程序. 使用正则表达式执行查找和替换操作,只需要调用Matcher对象的find()方法,就可以调用appendReplacement()方法来替换匹配的子序列.在提供给方法的新StringBu ...

  9. Java基础-类加载机制与自定义类Java类加载器(ClassLoader)

    Java基础-类加载机制与自定义类Java类加载器(ClassLoader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于类加载器的概念和分类我就不再废话了,因为我在之前的笔 ...

随机推荐

  1. 省略nslog打印

    //#if #endif宏定义的意思就是如果定义了DEBUG,那么就使用NSLog输出:否则这段代码直接忽略.有人会疑问这个DEBUG和_DEBUG来自哪里,这个其实不用担心,这个来自于Xcode的默 ...

  2. unity中Debug输出控制

    1 需求: (1)选择在界面.console中输出,并且能够设置保存到文档 (2)控制debug是否输出,可以在debug模式下输出,release模式下不输出 2 参考: 谢谢雨松同学的博客:htt ...

  3. StartSSL免费证书申请笔记

    第一步:申请startssl账号 填写相应信息后,你所填写的邮箱会收到邮件 里面有一个用来验证的验证码 输入得到的.... 注册成功后会安装数字证书(注意:注册过程中没有叫输入账号密码,这也是通过证认 ...

  4. SQL实现将一个表的数据插入到另外一个表的代码

    --第一种情况的 1>如果2张表的字段一致,并且希望插入全部数据,可以用这种方法: INSERT INTO 目标表 SELECT * FROM 来源表; 2>比如要将 articles 表 ...

  5. python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  6. J2SE 1.6 特性:java.lang.instrument

    1. import java.lang.instrument.Instrumentation; public class ObjectSizeFetcher { private static Inst ...

  7. Delphi xe7 FireMonkey / Mobile (Android, iOS)生成 QR Code完整实例

    这个实例在windows.OS X.IOS和Android等平台运行正常.本文参考这个网站提供的方法:http://zarko-gajic.iz.hr/firemonkey-mobile-androi ...

  8. Cocos2d-JS cc.DrawNode用法

    app.js var HelloWorldLayer = cc.Layer.extend({ sprite:null, ctor:function () { ///////////////////// ...

  9. mongoDB 安装配置

    1. 配置文件: 建立配置文件 :mongodb.conf dbpath=D:\mongoDb\data\db #配置数据库目录路径,预先手动创建db目录 logpath=D:\mongoDb\dat ...

  10. magento多语言中文语言包

    语言包key:http://connect20.magentocommerce.com/community/Mage_Locale_zh_CN