Spring设计模式(观察者模式)

博客用于学习记录:方便以后回顾

在记录学习的同时也在学习写博客,之前没有一个整体的目录框架,之后写设计模式的时候就按照现在的目录框架来写。

观察者模式: 在观察者和被观察者之间维护一个队列通道,对队列通道进行维护

模式的定义:

观察者模式的定义:

在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。

模式的结构图 :

springboot项目中使用观察者模式 spring 观察者模式_System

模式包含角色 :

观察者模式由四个角色组成:

抽象主题角色(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("博客 - 观察者模式");
    }
}

运行结果:

springboot项目中使用观察者模式 spring 观察者模式_System_02