目录
一、观察者模式
1. 观察者模式简介
观察者模式是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,使得每当一个对象改变状态时,所有依赖于它的对象都会被自动通知并且更新。
2. 观察者模式角色介绍
- 抽象主题(Subject):抽象主题是被观察者对象的接口,接口定义了增加、删除、通知观察者对象等方法。
- 具体主题 (Concrete Subject):作为抽象主题的实现类,具体主题内部状态发生改变时,会通知其观察者。
- 抽象观察者 (Obstract Observer):定义了观察者接口,包含了更新方法,当收到主题通知时,会调用此方法。
- 具体观察者 (Concrete Observer):抽象观察者的具体实现类,收到通知后会更新自身内部状态。
3. 观察者模式结构图
抽象主题与抽象观察者之间是单向联系,抽象观察者与内部状态对象也是单向联系,这样使得观察者与被观察者之间更加灵活地交换,建立了低耦合的关系。
4. 观察者模式简单实现
- 内部状态对象 Event
package BuilderPattern;
/**
* @create 2023-06-16 {20:16}
* 用到了建造型模式的思想
*/
public class Event {
private String event;
private String name;
private Event() {}
private Event(Builder builder) {
event = builder.event;
name = builder.name;
}
public static class Builder {
private String event;
private String name;
public Builder() {}
public Builder event(String event) {
this.event = event;
return this;
}
public Builder name(String name) {
this.name = name;
return this;
}
public Event build() {
return new Event(this);
}
}
public String getEvent() {
return event;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "事件:" + event + "\n名称:" + name;
}
}
- 抽象主题
package ObserverPattern.WasObserver;
import ObserverPattern.Observer.Observer;
/**
* @create 2023-06-16 {20:34}
* 抽象主题
*/
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
- 具体主题
package ObserverPattern.WasObserver;
import BuilderPattern.Event;
import ObserverPattern.Observer.Observer;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
/**
* @create 2023-06-16 {20:34}
* 抽象主题实现类 -- 具体主题
*/
public class EventDataSystem implements Subject {
private List<Observer> observerList = new ArrayList<Observer>();
private Event event;
private static final Logger LOGGER = Logger.getLogger(EventDataSystem.class.getName());
@Override
public void registerObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer: observerList) {
observer.update(event);
}
}
public void setEvent(Event event) {
this.event = event;
dataChange();
}
public void dataChange() {
LOGGER.info("获取到了最新的数据" + event);
notifyObservers();
}
}
- 抽象观察者
package ObserverPattern.Observer;
import BuilderPattern.Event;
/**
* @create 2023-06-16 {20:20}
* 抽象观察者
*/
public interface Observer {
public void update(Event event);
}
具体观察者
package ObserverPattern.Observer;
import BuilderPattern.Event;
import java.util.logging.Logger;
/**
* @create 2023-06-16 {20:32}
*/
public class Sina implements Observer {
private static final Logger LOGGER = Logger.getLogger(Sina.class.getName());
private Event event;
@Override
public void update(Event event) {
this.event = event;
display();
}
public void display() {
if (event == null) {
return;
}
LOGGER.info(">>>>>>>>>>>>>新浪网站获取到更新数据,进行更新操作");
LOGGER.info(">>>事件: {" + event.getEvent() + "} 名称: { "+ event.getName() + "}");
}
}
// Baidu
package ObserverPattern.Observer;
import BuilderPattern.Event;
import java.util.logging.Logger;
/**
* @create 2023-06-16 {20:22}
*/
public class Baidu implements Observer {
private static final Logger LOGGER = Logger.getLogger(Baidu.class.getName());
private Event event;
@Override
public void update(Event event) {
this.event = event;
display();
}
public void display() {
if (event == null) {
return;
}
LOGGER.info(">>>>>>>>>>>>>百度网站获取到更新数据,进行更新操作");
LOGGER.info(">>>事件: {" + event.getEvent() + "} 名称: { "+ event.getName() + "}");
}
}
// Sina
package ObserverPattern.Observer;
import BuilderPattern.Event;
import java.util.logging.Logger;
/**
* @create 2023-06-16 {20:32}
*/
public class Sina implements Observer {
private static final Logger LOGGER = Logger.getLogger(Sina.class.getName());
private Event event;
@Override
public void update(Event event) {
this.event = event;
display();
}
public void display() {
if (event == null) {
return;
}
LOGGER.info(">>>>>>>>>>>>>新浪网站获取到更新数据,进行更新操作");
LOGGER.info(">>>事件: {" + event.getEvent() + "} 名称: { "+ event.getName() + "}");
}
}
- 测试用例
package ObserverPattern.TestCase;
import BuilderPattern.Event;
import ObserverPattern.Observer.Baidu;
import ObserverPattern.Observer.Edge;
import ObserverPattern.Observer.Observer;
import ObserverPattern.Observer.Sina;
import ObserverPattern.WasObserver.EventDataSystem;
/**
* @create 2023-06-16 {21:05}
*/
public class ObserverTest {
public static void main(String[] args) {
EventDataSystem eds = new EventDataSystem();
Event.Builder builder = new Event.Builder();
eds.registerObserver(new Baidu());
eds.registerObserver(new Sina());
eds.setEvent( new Event.Builder()
.event("四级考试通知")
.name("6月16日四级考试")
.build());
Observer edge = new Edge();
eds.registerObserver(edge);
eds.setEvent(new Event.Builder()
.event("六级考试通知")
.name("下午进行六级考试")
.build());
eds.removeObserver(edge);
eds.setEvent(builder
.event("择日正常开放教学楼")
.name("恢复正常教学")
.build());
}
}
- 运行结果