美文网首页
Java设计模式之观察者模式(发布/订阅模式)

Java设计模式之观察者模式(发布/订阅模式)

作者: Baby_f146 | 来源:发表于2021-08-31 09:28 被阅读0次

    1、概述
    观察者模式又称为发布/订阅(Publish/Subscribe)模式
    观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer)
    (1)Subject模块
    Subjec模块有3个主要操作

    addObserver():注册添加观察者(申请订阅)
    deleteObserver():删除观察者(取消订阅)
    notifyObserver():主题状态发生变化时通知所有的观察者对象
    

    (2)Oserver模块
    Oserver模块有1个核心操作update(),当主题Subject状态改变时,将调用每个观察者的update()方法,更新通知。

    (3)UML图
    https://www.processon.com在线画的UML图

    image.png
    2、简单样例
    (1)主题接口
    package observer;
    
    public interface Subject {
        //添加观察者
        void addObserver(Observer obj);
        //移除观察者
        void deleteObserver(Observer obj);
        //当主题方法改变时,这个方法被调用,通知所有的观察者
        void notifyObserver();
    }
    

    (2)观察者接口

    package observer;
    
    public interface Observer {
        //当主题状态改变时,更新通知
        public void update(int version);
    }
    

    (3)主题实现类,某某杂志

    package observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MagazineSubject implements Subject{
        //存放订阅者
        private List<Observer> observers=new ArrayList<Observer>();
        //期刊版本
        private int version;
    
        @Override
        public void addObserver(Observer obj) {
            observers.add(obj);
        }
    
        @Override
        public void deleteObserver(Observer obj) {
            int i = observers.indexOf(obj);
            if(i>=0){
                observers.remove(obj);
            }
        }
    
        @Override
        public void notifyObserver() {
            for(int i=0;i<observers.size();i++){
                Observer o=(Observer)observers.get(i);
                o.update(version);
            }
        }
    
        //该杂志发行了新版本
        public void publish(){
            //新版本
            this.version++;
            //信息更新完毕,通知所有观察者
            notifyObserver();
        }
    }
    
    

    (4)观察者实现类

    package observer;
    
    public class CustomerObserver implements Observer{
        //订阅者名字
        private String name;
        private int version;
    
        public CustomerObserver(String name){
            this.name = name;
        }
    
        @Override
        public void update(int version) {
            this.version=version;
            System.out.println("该杂志出新版本了");
            this.buy();
        }
    
        public void buy(){
            System.out.println(name+"购买了第"+version+"期的杂志!");
        }
    
    }
    
    

    (5)测试类

    package observer;
    
    public class Main{
        public static void main(String[] args) {
            //创建主题(被观察者)
            MagazineSubject magazine = new MagazineSubject();
            //创建三个不同的观察者
            CustomerObserver a = new CustomerObserver("A");
            CustomerObserver b = new CustomerObserver("B");
            CustomerObserver c = new CustomerObserver("C");
            //将观察者注册到主题中
            magazine.addObserver(a);
            magazine.addObserver(b);
            magazine.addObserver(c);
    
            //更新主题的数据,当数据更新后,会自动通知所有已注册的观察者
            magazine.publish();
        }
    }
    

    执行结果

    该杂志出新版本了
    A购买了第1期的杂志!
    该杂志出新版本了
    B购买了第1期的杂志!
    该杂志出新版本了
    C购买了第1期的杂志!
    

    3、大数据运维平台中的观察者模式

    image.png

    原文地址:https://blog.csdn.net/chengyuqiang/article/details/79222294

    相关文章

      网友评论

          本文标题:Java设计模式之观察者模式(发布/订阅模式)

          本文链接:https://www.haomeiwen.com/subject/ehuoiltx.html