装载请标明出处:http://www.javashuo.com/article/p-bnuyxkop-mg.html html
观察者模式设计模式
说白了,就是一个对发生改变,全部依赖于它的对象也发生改变,这是一对多的关系。异步
好比对象A,对象B,对象C。B与C依赖于A,那么A发生改变,B与C也将发生改变。此时A是被观察者,B与C是观察者。ide
观察者模式又被称做发布/订阅模式,主要是为了让观察者与被观察者之间进行解耦。this
UML图:spa
角色说明:设计
Subject(抽象主题):被观察者的一个抽象类,它会把全部观察者的引用保存在一个集合里。抽象主题提供一个接口,能够增长和删除观察者对象。3d
ConcreteSubject(具体主题):具体的被观察者。当具体被观察者的状态发生改变的时候,会给每个注册过的观察者发送通知。调试
Observer(抽象观察者):全部具体观察者的一个抽象类,为全部的具体观察者定义了一个接口:获得主题的通知时候更新本身。code
ConcrereObserver(具体观察者):抽象观察者的具体实现。
咱们看一下具体的例子:
上课铃声响起时候,老师与学生们的不一样反应。
一、定义一个抽象主题:
该抽象主题定义了一些通用的方法,即具体主题里面须要实现的。
//抽象被观察者 public interface Observable { //添加观察者 void addObserver(Observer observer); //移除观察者 void deleteObserver(Observer observer); //通知观察者 void notifyObserver(String msg); }
二、建立一个具体主题(上课铃声):
public class AlarmClock implements Observable { //保存观察者对象 List<Observer> list = new ArrayList<>(); @Override public void addObserver(Observer observer) { list.add(observer); } @Override public void deleteObserver(Observer observer) { list.remove(observer); } /** * 通知观察者 * @param msg */ @Override public void notifyObserver(String msg) { for (Observer observer : list) { observer.action(msg); } } }
三、建立抽象观察者:
定义了全部具体观察者须要实现的方法,听到铃声后的行为
//抽象观察者 public interface Observer { void action(String msg); }
四、建立具体观察者:
public class Students implements Observer { String name; public Students(String name) { this.name = name; } @Override public void action(String msg) { System.out.println(msg + name + "开始听课"); } } public class Teacher implements Observer { @Override public void action(String msg) { System.out.print(msg + "老师开始讲课"); } }
六、实现:
Observable alarmClock = new AlarmClock(); Observer student1 = new Students("小屁孩"); Observer student2 = new Students("大屁孩"); Observer teacher = new Teacher(); //注册观察者 alarmClock.addObserver(student1); alarmClock.addObserver(student2); alarmClock.addObserver(teacher); //被观察者通知已经注册的观察者 alarmClock.notifyObserver("上课铃声已经响了");
七、结果:
到这里咱们便实现了观察者模式。