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

    /**
     * 抽象被观察者接口
     */
    public interface Subject {
        //注册观察者
        public void registerObserver(Observer o);
        //移除观察者
        public void removeObserver(Observer o);
        //通知
        public void notifyObserver();
    }
    
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 被观察者
     */
    public class ConcreteSubject implements Subject{
        private List<Observer> list;
        private String message;
        public ConcreteSubject() {
            list = new ArrayList<>();
        }
        @Override
        public void registerObserver(Observer o) {
            list.add(o);
        }
    
        @Override
        public void removeObserver(Observer o) {
            if (!list.isEmpty()){
                list.remove(o);
            }
        }
    
        @Override
        public void notifyObserver() {
            for (Observer ob : list) {
                ob.update(message);
            }
        }
        //发送消息
        public void setInformation(String s){
            this.message = s;
            System.out.println("更新消息:"+s);
            notifyObserver();//通知观察者
        }
    }
    
    /**
     * 抽象观察者
     */
    public interface Observer {
        public void update(String message);
    }
    
    
    /**
     * 观察者
     */
    public class ConcreteObserver implements Observer {
        private String name;
        private String message;
    
        public ConcreteObserver(String name) {
            this.name = name;
        }
        @Override
        public void update(String message) {
            this.message = message;
            read();
        }
    
        private void read() {
            System.out.println(name+"收到推送消息:"+message);
        }
    }
    
    import com.mod.ConcreteObserver;
    import com.mod.ConcreteSubject;
    
    /**
     * 测试
     */
    public class ObserverTest {
        public static void main(String[] args){
            ConcreteSubject subject = new ConcreteSubject();
            ConcreteObserver zs = new ConcreteObserver("zs");
            ConcreteObserver ls = new ConcreteObserver("ls");
            subject.registerObserver(zs);
            subject.registerObserver(ls);
            subject.setInformation("通知:中秋放假去月球");
            subject.removeObserver(zs);
            subject.setInformation("通知:中秋节活动取消");
            //更新消息:通知:中秋放假去月球
            //zs收到推送消息:通知:中秋放假去月球
            //ls收到推送消息:通知:中秋放假去月球
            //更新消息:通知:中秋节活动取消
            //ls收到推送消息:通知:中秋节活动取消
        }
    }
    

    java封装好的

    /**
     * 观察者
     */
    import java.util.Observable;
    import java.util.Observer;
    
    public class Watcher implements Observer {
        @Override
        public void update(Observable o, Object arg) {
            System.out.println(o+":"+arg);
        }
    }
    
    import java.util.Observable;
    
    /**
     * 被观察者
     */
    public class BeingWatched extends Observable {
        public void setInformation(String s){
            setChanged();
            notifyObservers(s);
        }
    }
    
    //测试
    import com.mod.BeingWatched;
    import com.mod.Watcher;
    
    public class ObserverDemo {
        public static void main(String[] args){
            BeingWatched watched = new BeingWatched();
            watched.addObserver(new Watcher());
            watched.setInformation("消息:。。。");
        }
        //com.mod.BeingWatched@2503dbd3:消息:。。。
    }
    
  • 相关阅读:
    使用BeanShell 对比取出来的值
    https 请求的端口是443 注意
    Jmeter录制App 请求是HTTPS的
    Charles-断点
    随手记--分配事件概率
    看日志有没有 出现错误的字段 (如 crash ) 查找app闪退
    学习的网站
    xss 攻击 sql 注入
    app的apk 安装的方法--adb--命令安装 (含把apk放某个文件夹,每次启动自己安装)
    把2列相加的方法
  • 原文地址:https://www.cnblogs.com/fly-book/p/11425105.html
Copyright © 2011-2022 走看看