• 观察者模式


    观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标将情况发送到观察者的。

    观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。

    现在我们举一个类似的情况,并使用代码来实现,为大家提供一个比较明显的认识。

    大家都用过交流平台工具,如微信、qq,那么肯定知道"特别关心"这个功能,当你将谁设置为特别关心的时候,那个人一但发表朋友圈,系统就会立刻通知你,你的特别关心好友发表了一遍文章。。。假设小新的爸爸妈妈将小新设为了特别关心,用观察者模式改如何实现呢?那么我们就来实现下吧。

    1、//观察者

    //观察者
    public class PersonObserver implements Observer {
    
        private String name;
    
        public PersonObserver(String name) {
            this.name = name;
        }
    
        @Override
        public void update(Observable o, Object arg) {
            Circle circle = (Circle)o;
            Infomation args = (Infomation)arg;
            System.out.println(name+"接收到一个"+args.getName()+"发表的一个"+circle.getName()+"的朋友圈--"+args.getContext());
        }
    }
    

    2、被观察者信息

    public class Infomation {
    
        private String name;
    
        private String context;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getContext() {
            return context;
        }
    
        public void setContext(String context) {
            this.context = context;
        }
    }
    

    3、被观察者

    public class Circle  extends Observable {
    
        private String name;
    
        public Circle(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
        public void produceInfo(Circle circle,Infomation infomation){
            System.out.println(infomation.getName()+"发表了一个关于"+circle.getName()+"的朋友圈---"+infomation.getContext());
            setChanged();
            notifyObservers(infomation);
        }
    }
    

    4、测试代码

    public class Test {
    
        public static void main(String[] args) {
            Circle circle = new Circle("新年");
            PersonObserver persion = new PersonObserver("小新爸爸");
            circle.addObserver(persion);
            PersonObserver persion2 = new PersonObserver("小新妈妈");
            circle.addObserver(persion2);
    
            Infomation infomation = new Infomation();
            infomation.setName("小新");
            infomation.setContext("今天是个好日子");
            circle.produceInfo(circle,infomation);
        }
    }

    运行结果为:

    想要飞得更高,就该忘记地平线!
  • 相关阅读:
    Half Nice Years Gym
    LCM from 1 to n
    Educational Codeforces Round 70 (Rated for Div. 2)
    Rating(概率DP) HDU
    Josephina and RPG(概率DP) ZOJ
    数据结构实验之串二:字符串匹配(字符串哈希)
    点分治——入门学习笔记
    使用ASP.NET Core 3.x 构建 RESTful API P15 处理故障
    使用ASP.NET Core 3.x 构建 RESTful API P13 P14 获取父子关系的资源
    使用ASP.NET Core 3.x 构建 RESTful API P11 P12 ActionResult of T 以及 AutoMapper
  • 原文地址:https://www.cnblogs.com/shenwen/p/12686128.html
Copyright © 2020-2023  润新知