Java观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
Java中实现观察者模式有两种方法:一是使用java.util.Observable和java.util.Observer;二是使用java.util.EventListener。
// 使用 java.util.Observable 和 java.util.Observer 实现 Java 观察者模式 public class MySubject extends Observable{ public void doSomething(){ System.out.println("MySubject doSomething"); // 通知所有的观察者 this.setChanged(); // 通知所有的观察者,表示 MySubject 状态发生了改变 this.notifyObservers(); } } public class Observer1 implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("observer1 has received!"); } } public class Observer2 implements Observer{ @Override public void update(Observable o, Object arg) { System.out.println("observer2 has received!"); } }
观察者模式用于在一个对象被修改时通知其相关对象。
观察者模式是一种行为模式类别。
import java.util.ArrayList; import java.util.List; class MyValue { private List<Observer> observers = new ArrayList<Observer>(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer){ observers.add(observer); } public void notifyAllObservers(){ for (Observer observer : observers) { observer.update(); } } } abstract class Observer { protected MyValue subject; public abstract void update(); } class PrinterObserver extends Observer{ public PrinterObserver(MyValue subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("Printer: " + subject.getState() ); } } class EmailObserver extends Observer{ public EmailObserver(MyValue subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("Email: "+ subject.getState() ); } } class FileObserver extends Observer{ public FileObserver(MyValue subject){ this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("File: " + subject.getState()); } } public class Main { public static void main(String[] args) { MyValue subject = new MyValue(); new FileObserver(subject); new EmailObserver(subject); new PrinterObserver(subject); subject.setState(15); subject.setState(10); } }
上面的代码生成以下结果。
Java设计模式 - 代理模式在代理模式中,一个类代表另一个类的功能。代理模式是一种结构模式。在代理模式中,我们创建具有原始接...
Java设计模式 - 工厂模式工厂模式是一种创建模式,因为此模式提供了更好的方法来创建对象。在工厂模式中,我们创建对象而不将创...
Java面向对象设计 - Java导入导入声明用于将任何类型导入编译单元。导入声明出现在包声明之后,第一个类型声明之前。有两种类型...
Java面向对象设计 -Java方法重载在同一类中具有多个具有相同名称的方法称为方法重载。类中具有相同名称的方法可以是声明的方法,...
Java面向对象设计 -Java varargs方法术语“varargs是“可变长度参数的缩写。varargs声明一个接受可变数量的参数(或参数)的方法...