zoukankan      html  css  js  c++  java
  • 观察者模式

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

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

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

    大家都用过交流平台工具,如微信、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);
        }
    }

    运行结果为:

    想要飞得更高,就该忘记地平线!
  • 相关阅读:
    jQuery中时间戳和日期的相互转换
    jquery append 方法应用
    MySQL中实现连续日期内数据统计,缺省天数0补全
    jQuery通过ajax请求php遍历json数组到table中的代码
    sql相同表不同查询条件合并显示
    paginate()出来的数据怎样循环插入数据?
    使用paginate分页后数据处理
    ThinkPhp3.2.3 使用phpExcel导入数据
    判断时间戳是星期几
    英文加数字升序/降序
  • 原文地址:https://www.cnblogs.com/shenwen/p/12686128.html
Copyright © 2011-2022 走看看