控制台程序。

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. Unknown collation: 'utf8mb4_unicode_ci'

    日前给一个政府机关做个小的门户网站,用的是wordpress+主题开发,部署时发现导入数据库sql文本时出现Unknown collation: 'utf8mb4_unicode_ci'的错误,查了下 ...

  2. the core or essence of a computer

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION The ALU is that part ...

  3. dynamic-link library shared library of functions and resources

    https://msdn.microsoft.com/en-us/library/1ez7dh12.aspx A dynamic-link library (DLL) is an executable ...

  4. anti-pattern - Hard coding

    https://en.wikipedia.org/wiki/Hard_coding Considered an anti-pattern, hard coding requires the progr ...

  5. JAVA函数的返回值类型详解以及生成随机数的例题

    函数的四要素:函数名.输入.输出(返回).加工. 函数分为两种:一种是有返回值得函数,一种是没有返回值的函数. 1. 定义:没有返回值的函数:(当我不需要函数的计算结果再拿出来进行运算的时候,我就不需 ...

  6. Nginx return 关键字配置小技巧

    Nginx的return关键字属于HttpRewriteModule模块: 语法:return http状态码 默认值:无 上下文:server,location,if 该指令将结束执行直接返回htt ...

  7. Myeclipse配置 项目编码格式

    修改MyEclipse 工作空间的编码 修改之后,在该工作空间下创建的任何项目,编码都是UTF-8,既,该项目下所有文件都是utf-8 格式,工作空间影响项目,项目影响文件 General --> ...

  8. sphinx

    1.什么是SphinxSphinx 是一个在GPLv2 下发布的一个全文检索引擎,商业授权(例如, 嵌入到其他程序中)需要联系我们(Sphinxsearch.com)以获得商业授权.一般而言,Sphi ...

  9. C++ 简单 Hash容器的实现

    主要实现了以整数为关键字的hash,以key%m_nSize为哈希函数,以(hash(key)+i)%m_nSize重新寻址,并附带了elf_hash的实现,使用过程中可灵活修改. #ifndef _ ...

  10. sql server2008企业版和标准版

    SQL Server 的企业版和标准版的License价格差5倍之多,在企业应用中,DBA 经常会被这个问题问住,本帖将日常工作实践中遇到到版本问题给出第一手资料,陆续补充…… SQL 2008 镜像 ...