目录
应用场景
1.结构
2.效果
3.代码
3.1.Main方法的类【ObserverPatternExample】
3.2.主题(接口)【Subject】
3.3.观察者(接口)【Observer】
3.4.主题(实现类)【ConcreteSubject】
3.5.观察者(实现类)【ConcreteObserver】
==========
应用场景
张三,李四,王五,分别都去了售楼处,想要购买新房,
售楼处现在没有房子,记录了他们的联系方式,
告诉他们,有新房时,我们售楼处,会和你们联系。
售楼处:发布者(发布主题,有新房销售)
购房者:观察者(订阅主题,是否有新房发售)
1.结构
2.效果
3.代码
3.1.Main方法的类【ObserverPatternExample】
package com.sxz.study.observer;
public class ObserverPatternExample {
public static void main(String[] args) {
// 发布,订阅者模式
// 定义了对象间的一种一对多的依赖关系
// 【发布者】 (售楼处)
Subject subject = new ConcreteSubject();
// 【发布者】拥有,观察者列表(有意向购房人员的名单)
Observer observer1 = new ConcreteObserver("张三");
Observer observer2 = new ConcreteObserver("李四");
Observer observer3 = new ConcreteObserver("王五");
subject.registerObserver(observer1); // 相当于,观察者订阅(Subscribe)主题(Subject)。(购房者说,有新楼盘时,通知我)
subject.registerObserver(observer2);
subject.registerObserver(observer3);
// 【发布者】提供了一个发布事件的能力,发布事件(告诉有意向的购房者们,有新房发售了!)
subject.setMessage("我是HD楼盘,小许,有新房销售");
}
}
===
3.2.主题(接口)【Subject】
package com.sxz.study.observer;
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
// 上面三个方法,是普遍的,下面这个方法,根据情况,自己定义
void setMessage(String message);
}
===
3.3.观察者(接口)【Observer】
package com.sxz.study.observer;
public interface Observer {
void reciveMessage(String message);
}
===
3.4.主题(实现类)【ConcreteSubject】
package com.sxz.study.observer;
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject {
// 观察者列表
private List<Observer> observers;
// 要发布的消息
private String message;
public ConcreteSubject() {
this.observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
// 通知所有的观察者
for (Observer observer : observers) {
observer.reciveMessage(message);
}
}
@Override
public void setMessage(String message) {
this.message = message;
notifyObservers();
}
}
===
3.5.观察者(实现类)【ConcreteObserver】
package com.sxz.study.observer;
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void reciveMessage(String message) {
System.out.println(name + " received message: " + message);
}
}
===