一、设计思想
观察者模式就像订阅报纸一样,每当报社印出新的报纸就会把把报纸送到订阅者家。
二、自己实现观察者模式
首先创建一个主题的接口,里面拥有注册观察者的方法,取消注册的方法,发送更新的数据的方法。在创建一个观察者的接口,里面拥有数据更新后的操作的方法。
代码实现:
主题接口
public interface Subject {
public void registerObserver(Observer ob);
public void removeObserver(Observer ob);
public void notifyObserver();
}
观察者接口
public interface Observer {
public void update(int num1,int num2);
}
主题实现类
public class Numbers implements Subject{
List<Observer> list;
int num1;
int num2;
public Numbers() {
list=new ArrayList<>();
}
@Override
public void registerObserver(Observer ob) {
// TODO 自动生成的方法存根
list.add(ob);
}
@Override
public void removeObserver(Observer ob) {
// TODO 自动生成的方法存根
list.remove(ob);
}
@Override
public void notifyObserver() {
// TODO 自动生成的方法存根
Iterator<Observer> iterator=list.iterator();
while(iterator.hasNext()) {
iterator.next().update(num1, num2);
}
}
public void random() {//模拟数据产生变化
num1=(int)(Math.random()*100);
num2=(int)(Math.random()*100);
notifyObserver();
}
}
观察者实现类
public class Add implements Observer{
Subject subject;
public Add(Subject subject) {
this.subject=subject;
subject.registerObserver(this);
}
@Override
public void update(int num1, int num2) {
// TODO 自动生成的方法存根
int num=num1+num2;
System.out.println(num+"");
}
}
public class Sub implements Observer{
Subject subject;
public Sub(Subject subject) {
this.subject=subject;
subject.registerObserver(this);
}
@Override
public void update(int num1, int num2) {
// TODO 自动生成的方法存根
int num=num1-num2;
System.out.println(num+"");
}
}
测试代码
public class Test {
public static void main(String[] args) {
Numbers numbers=new Numbers();
Add add=new Add(numbers);
Sub sub=new Sub(numbers);
numbers.random();
numbers.random();
numbers.random();
numbers.random();
}
}
运行结果:
三、使用JDK自带的api
JDK自带一个主题类,使用的时候继承它,这个主题类多了一个setChanged方法,发送更新数据前先调用这个方法,JDK还提供了观察者的接口Observer,观察者需要实现这个接口。
代码示例:
主题类
public class Number extends Observable {
private int num1;
private int num2;
public void random() {
num1=(int)(Math.random()*100);
num2=(int)(Math.random()*100);
setChanged();
notifyObservers();
}
public int getNum1() {
return num1;
}
public int getNum2() {
return num2;
}
}
观察者类
public class Add implements Observer{
Observable ob;
public Add(Observable ob) {
this.ob=ob;
ob.addObserver(this);
}
@Override
public void update(Observable arg0, Object arg1) {
// TODO 自动生成的方法存根
Number number=(Number)arg0;
int num=number.getNum1()+number.getNum2();
System.out.println(num+"");
}
}
public class Sub implements Observer{
Observable ob;
public Sub(Observable ob) {
this.ob=ob;
ob.addObserver(this);
}
@Override
public void update(Observable arg0, Object arg1) {
// TODO 自动生成的方法存根
Number number=(Number)arg0;
int num=number.getNum1()-number.getNum2();
System.out.println(num+"");
}
}
测试代码:
public class Test {
public static void main(String[] args) {
Number number=new Number();
Add add=new Add(number);
Sub sub=new Sub(number);
number.random();
number.random();
number.random();
number.random();
}
}
运行结果: