• Java基础之一组有用的类——Observable和Observer对象(Horrific)


    控制台程序。

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

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

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

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

     1 import java.util.Observable;
     2 
     3 public class JekyllAndHyde extends Observable {
     4   public void drinkPotion() {
     5     name = "Mr.Hyde";
     6     setChanged();
     7     notifyObservers();
     8   }
     9 
    10   public String getName() {
    11     return name;
    12   }
    13 
    14   private String name = "Dr. Jekyll";
    15 }


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

     1 import java.util.Observer;
     2 import java.util.Observable;
     3 
     4 public class Person implements Observer {
     5   // Constructor
     6   public Person(String name, String says) {
     7     this.name = name;
     8     this.says = says;
     9   }
    10 
    11   // Called when observing an object that changes
    12   public void update(Observable thing, Object o) {
    13     System.out.println("It's " + ((JekyllAndHyde)thing).getName() + "
    " + name + ": " + says);
    14   }
    15 
    16   private String name;                                                 // Person's identity
    17   private String says;                                                 // What they say when startled
    18 }

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

     1 // Try out observers
     2 import java.util.Observer;
     3 
     4 public class Horrific {
     5   public static void main(String[] args) {
     6     JekyllAndHyde man = new JekyllAndHyde();     // Create Dr. Jekyll
     7 
     8     Observer[] crowd = {
     9       new Person("Officer","What's all this then?"),
    10       new Person("Eileen Backwards", "Oh, no, it's horrible those teeth!"),
    11       new Person("Phil McCavity", "I'm your local dentist here's my card."),
    12       new Person("Slim Sagebrush", "What in tarnation's goin'on here?"),
    13       new Person("Freaky Weirdo", "Real cool, man. Where can I get that stuff?")
    14                        };
    15 
    16     // Add the observers
    17     for(Observer observer : crowd) {
    18       man.addObserver(observer);
    19     }
    20     man.drinkPotion();                           // Dr. Jekyll drinks up
    21   }
    22 }

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

  • 相关阅读:
    C#多线程编程
    div水平垂直居中方法及优缺点
    Socket网络编程(TCP/IP/端口/类)和实例
    LINQ to SQL语句大全
    SQL Server修改表结构后批量更新所有视图
    SQL Server修改表结构后批量更新所有视图
    SQL Server修改表结构后批量更新所有视图
    开源Asp.Net Core小型社区系统DotNetClub
    CkEditor 4.1.3 + CkFinder 2.4
    文本编辑器-->CKEditor+CKFinder使用与配置
  • 原文地址:https://www.cnblogs.com/mannixiang/p/3438793.html
Copyright © 2020-2023  润新知