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

    定义:

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

      其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

    模式对象:

    • 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
    • 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
    • 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
    • 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
    /**
     * @author yuyang
     * @DATE 2019/1/7 0007-10:14
     * 抽象观察者接口
     */
    public interface Observer {
        //接收信息
        void receiveInformation (String msg);
    }
    /**
     * @author yuyang
     * @DATE 2019/1/7 0007-10:13
     * 抽象被观察者接口
     */
    public interface Observerable {
        //新增关注
        void register(Observer observer);
        //取消关注
        void remove(Observer observer);
        //订阅消息通知
        void notifyMsm();
    }
    /**
     * @author yuyang
     * @DATE 2019/1/7 0007-10:23
     * 具体观察者
     */
    public class User implements Observer{
       String name;
       String msg;
    
        public User(String name) {
            this.name = name;
        }
    
        @Override
        public void receiveInformation(String msg) {
            this.msg=msg;
            read();
        }
        public  void read(){
            System.out.println(name+"接收到的推送:"+msg);
        }
    }
    /**
     * @author yuyang
    * 具体被观察者 * @DATE 2019/1/7 0007-10:16
    */ public class WechatServer implements Observerable { List<Observer> list; String msg; public WechatServer() { list = new ArrayList<>(); } @Override public void register(Observer observer) { list.add(observer); } @Override public void remove(Observer observer) { if (list != null) { list.remove(observer); } } @Override public void notifyMsm() { for (Observer ls: list) { ls.receiveInformation(msg); } } //编辑推送消息 public void setinformation(String s){ this.msg = s; System.out.println("微信服务更新消息: " + s); //消息更新,通知所有观察者 notifyMsm(); } }
    /**
     * @author yuyang
     * @DATE 2019/1/7 0007-10:28
     */
    public class Test {
        public static void main(String[] args) {
            WechatServer observerable=new WechatServer();
            User user=new User("与昂");
            User user2=new User("yuang");
            User user3=new User("于洋");
            observerable.register(user);
            observerable.register(user2);
            observerable.register(user3);
            observerable.setinformation("PHP是世界上最好的语言");
            System.out.println("___________________________________________");
            observerable.remove(user3);
            observerable.setinformation("那你把Java放在那里?");
        }
    }

  • 相关阅读:
    5、打断点(bpu)
    4、post请求(json)
    3、get请求(url详解)
    2、接口测试(Composer)
    1、Fiddler基础
    常规测试、安全测试、渗透测试-区别
    记录一次python的mysqlclient依赖库报错问题
    airflow当触发具有多层subDAG的任务的时候,出现[Duplicate entry ‘xxxx’ for key dag_id]的错误的问题处理
    Python3并发写文件
    python hash 每次调用结果不一样
  • 原文地址:https://www.cnblogs.com/yuyangcoder/p/10231870.html
Copyright © 2011-2022 走看看