设计模式:5、观察者模式(发布-订阅模式)
目录
0、定义
定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都得到通知并被自动更新。
1、观察者模式的四种角色
- 主题(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如,添加、删除观察者以及通知观察者更新数据的方法。
- 观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。
- 具体主题(ConcreteSubject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题需使用一个集合,比如ArrayList,存放观察者的引用,以便数据变化时通知具体观察者。
- 具体观察者(ConcreteObserver):具体观察者是实现观察者接口的类的一个实例。具体观察者包含有可以存放具体主题引用的主题接口变量,以便具体观察者让具体主题将自己的引用添加到具体主题的集合中,使自己成为它的观察者,或让这个具体主题将自己从具体主题的集合中删除,使自己不再是它的观察者。
2、观察者模式的UML类图
3、示例代码
观察者:
package xyz.jangle.design.observer;
public interface Observer {
public void update();
}
主题:
package xyz.jangle.design.observer;
public interface Subject {
public void addObserver(Observer observer);
public void deleteObserver(Observer observer);
public void notifyObserver();
}
具体观察者:
package xyz.jangle.design.observer;
/**
* 具体观察者
* @author Administrator
*
*/
public class ConcreteObserver implements Observer {
private Subject subject;
public ConcreteObserver(Subject subject) {
super();
this.subject = subject;
this.subject.addObserver(this);
}
@Override
public void update() {
System.out.println("主题中更新了新内容");
}
}
具体主题:
package xyz.jangle.design.observer;
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject {
private List<Observer> observers;
public ConcreteSubject() {
super();
observers = new ArrayList<Observer>();
}
@Override
public void addObserver(Observer observer) {
if(!observers.contains(observer)) {
observers.add(observer);
}
}
@Override
public void deleteObserver(Observer observer) {
if(observers.contains(observer)) {
observers.remove(observer);
}
}
@Override
public void notifyObserver() {
for(Observer observer:observers) {
observer.update();
}
}
}
客户端(使用):
package xyz.jangle.design.observer;
public class AppMain5 {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver(subject);
ConcreteObserver observer2 = new ConcreteObserver(subject);
ConcreteObserver observer3 = new ConcreteObserver(subject);
subject.notifyObserver();
System.out.println("------------------");
subject.deleteObserver(observer1);
subject.notifyObserver();
System.out.println("------------------");
subject.deleteObserver(observer2);
subject.deleteObserver(observer3);
subject.notifyObserver();
}
}
原文地址:https://blog.csdn.net/Bof_jangle/article/details/143943748
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!