Spring设计模式(观察者模式)
博客用于学习记录:方便以后回顾
在记录学习的同时也在学习写博客,之前没有一个整体的目录框架,之后写设计模式的时候就按照现在的目录框架来写。
观察者模式: 在观察者和被观察者之间维护一个队列通道,对队列通道进行维护
模式的定义:
观察者模式的定义:
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
模式的结构图 :
模式包含角色 :
观察者模式由四个角色组成:
抽象主题角色(Subject):把所有的观察者角色的引用保存在一个集合中,可以有任意数量的观察者。其提供一个接口,可以添加、删除观察者,并可以向登记过的观察者发送通知。
具体主题角色(Observer):实现了抽象主题角色提供的接口的一个具体类。
抽象观察者角色(ConcreteSubject):提供一个接口,以接收主题角色发送的通知。
具体观察者角色(ConcreteObserver):实现了抽象观察者角色提供的接口的一个具体类。
使用场景 :
监听器、日志收集、短信通知、邮件通知
模式具体实现 :
一 : 定义通知回调格式
@Data
@Builder
public class Event {
/**
* 事件源
*/
private Object source;
/**
* 通知目标
*/
private Object target;
/**
* 监听事件
*/
private String message;
/**
* 事件时间
*/
private long time;
}
二 :定义观察者接口
public interface Observer {
/**
* 被观察的操作方法
* @param event 操作打印日志
*/
public void operation(Event event);
}
三 :定义监听接口
public interface Listener {
/**
* 注册观察者
* @param object
*/
public void registerObserver(Observer object);
/**
* 删除观察者
* @param observer
*/
public void removeObserver(Observer observer);
/**
* 通知观察者
* @param message 通知消息
*/
public void notifyObserver(String message);
}
四:实现观察者接口
public class Person implements Observer {
private String name;
public Person(String name) {
this.name = name;
}
public void operation(Event event) {
System.out.println(" 观察者 : " + name + " 接收到信息 " + event.toString());
}
}
五:实现监听者接口
public class EventListener implements Listener {
private List<Observer> events = new ArrayList<Observer>();
public void registerObserver(Observer object) {
events.add(object);
}
public void removeObserver(Observer observer) {
events.remove(observer);
}
public void notifyObserver(String message) {
for (Observer observer : events) {
Event event = Event.builder()
.source(this)
.target(observer)
.message(message)
.time(System.currentTimeMillis())
.build();
observer.operation(event);
}
}
}
六:实现观察者与监听者关联
public class Subject {
Listener listener;
public Subject(Listener listener) {
this.listener = listener;
}
public void sendMsg(String msg){
System.out.println(msg);
listener.notifyObserver(msg);
}
public void sendBlog(String blog){
System.out.println(blog);
listener.notifyObserver(blog);
}
}
七:测试
public class ObserverTest {
@Test
public void test_observer(){
Person person = new Person("张三");
Person person1 = new Person("李四");
Person person2 = new Person("王五");
Listener listener = new EventListener();
listener.registerObserver(person);
listener.registerObserver(person1);
listener.registerObserver(person2);
Subject subject = new Subject(listener);
subject.sendMsg("官宣");
//李四取消关注
listener.removeObserver(person1);
System.out.println("李四取消关注\n");
subject.sendBlog("博客 - 观察者模式");
}
}
运行结果: