百度百科
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
观察者抽象类
//抽象的报纸订阅者
public abstract class Subscribers {
//提供一个方法,供观察者调用,更新状态
//比如提供一个信箱,把报纸放进去
public abstract void update(String state);
}
订阅者A
public class SubscribersA extends Subscribers{
@Override
public void update(String state) {
System.out.println("报纸更新了,内容:" + state);
}
}
订阅者B
public class SubscribersB extends Subscribers{
@Override
public void update(String state) {
System.out.println("报纸更新了,内容:" + state);
}
}
报纸抽象类(被观察者)
public abstract class Newspaper {
//哪些人订阅了报纸
protected List<Subscribers> subscribers = new ArrayList<>();
//添加到订阅者列表中
public void add(Subscribers subscriber) {
subscribers.add(subscriber);
}
//取消订阅
public void delete(Subscribers subscriber) {
subscribers.remove(subscriber);
}
//通知订阅者,报纸更新了
public void notifySubscribers(String content) {
for (Subscribers subscriber : subscribers) {
subscriber.update(content);
}
}
}
客户端
public class Main {
public static void main(String[] args) {
Newspaper xinhua = new XinhuaDaily();
Subscribers a = new SubscribersA();
Subscribers b = new SubscribersB();
xinhua.add(a);
xinhua.add(b);
xinhua.notifySubscribers("2018来了");
}
}
Observable是java实现观察者模式的一种方式,被观察者需要继承Observable,观察者实现Observer接口。
被观察者
//学生,被观察者,继承Observable(可以被观察的)
public class Student extends Observable {
public void study(){
System.out.println("学生:1+1=几");
setChanged(); //只有调用setChanged()方法和并通知观察者notifyObservers(),观察者才会解释到通知,调用观察者内部update()方法
notifyObservers();
}
}
观察者
//观察者内部必须重写update()方法
public class Teacher implements Observer{
@Override
public void update(Observable observable, Object object) {
//observable,被观察者可以直接把自己传递给观察者
//object,被观察者可以传递对象给观察者
System.out.println("老师:2");
}
}
测试类
public class Test {
public static void main(String[] args) {
Student student = new Student(); //创建一个被观察者
Teacher teacher = new Teacher(); //创建一个观察者
student.addObserver(teacher); //把被观察者添加到观察者所观察的集合中
student.study();
}
}