设计模式-观察者模式
观察者模式
定义:观察者模式(发布-订阅模式),指多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。
使用场景:
- 一个对象的改变会导致其他一个或多个对象的改变
- 一个对象必须通知其他对象
结构:
- 抽象主题(Subject):抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
- 具体主题(Concrete Subject):具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
- 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
- 具体观察者(Concrete Observer):实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
注意:Java已经实现了观察者模式
我们利用Java实现的接口,做如下一个例子,我有两个同学,我的手机号修改了,通知到同学去修改。
例子:
public class MyInfo extends Observable {
private String telNum;
public String getTelNum() {
return telNum;
}
public void setTelNum(String telNum) {
this.telNum = telNum;
}
public void updateTelNum(String telNum){
super.setChanged();
super.notifyObservers(telNum);
this.telNum=telNum;
}
}
public class Studen1 implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("学生1收到了修改信息,改为"+arg);
}
}
public class Studen2 implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("学生2收到了修改信息,改为"+arg);
}
}
测试代码:
public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
Observable observable=new MyInfo();
observable.addObserver(new Studen1());
observable.addObserver(new Studen2());
((MyInfo) observable).updateTelNum("12345678");
}
书山有路勤为径,学海无涯苦作舟