设计模式之观察者模式
一、观察者模式UML图
观察者模式:多个观察者同时监听同一个对象,如果该对象有变化,会通知所有的观察者对象。
例如:天气预报、公司通知放假等等
Observer 观察者接口,如果主题发生变更时,则更新状态
ObserverImpl:观察者的实现类,主题发生变化时,更新自己的状态
Subject:主题的父类,所有需要观察的主题应该继承这个类
SubjectImp:主题的子类,为对应的具体的主题,
二、观察者具体代码实现
1、新建观察者接口
public interface Observer {
/**
* 更新主题
* @param subject
*/
void update(Subject subject);
}
2、新建主题父类
public class Subject {
/**
* 需要观察的对象主题,该对象中要包含所有观察者对象,可以增加或者删除观察者对象
*/
private List<Observer> observerList = new ArrayList<>();
/**
* 添加观察者
* @param o
*/
public void addOberver(Observer o){
observerList.add(o);
}
/**
* 删除观察者
* @param o
*/
public void deleteObserver(Observer o){
observerList.remove(o);
}
/**
* 通知所有观察者
*/
public void noticeAllObserver(){
for (Observer each : observerList) {
each.update(this);
}
}
}
3、新建观察者实现类
public class ObserverImpl implements Observer {
private int status;
/**
* 通知具体的观察者更新主题对象
* @param subject
*/
@Override
public void update(Subject subject) {
this.status = ((SubjectImp)subject).getStatus();
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
4、新建主题的子类
public class SubjectImp extends Subject {
private int status;
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
/**
* 通知所有的观察者
*/
this.noticeAllObserver();
}
}
5、测试
public class TestMain {
public static void main(String[] args) {
Subject subject = new SubjectImp();
ObserverImpl o1 = new ObserverImpl();
ObserverImpl o2 = new ObserverImpl();
ObserverImpl o3 = new ObserverImpl();
o1.setStatus(1);
o2.setStatus(2);
o3.setStatus(3);
subject.addOberver(o1);
subject.addOberver(o2);
subject.addOberver(o3);
System.out.println("打印修改之前的状态");
System.out.println(o1.getStatus());
System.out.println(o2.getStatus());
System.out.println(o3.getStatus());
((SubjectImp) subject).setStatus(10);
System.out.println("打印修改之后的状态");
System.out.println(o1.getStatus());
System.out.println(o2.getStatus());
System.out.println(o3.getStatus());
}
}
打印结果如下:
打印修改之前的状态
1
2
3
打印修改之后的状态
10
10
10