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:消息:。。。
    }
    
  • 相关阅读:
    [io PWA] keynote: Launching a Progressive Web App on Google.com
    hdu 4491 Windmill Animation
    BNU Concentric Rings
    Android 如何去掉手机中横竖屏切换时的转屏动画?
    IOS NSString 用法详解
    MySQL有关1042 Can’t get hostname for your address的问题分析解决过程
    网站出现问题时,站长该如何解决
    [置顶] IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片)
    具备这5点因素,你就是一名合格的网络编辑
    IOS 新消息通知提示-声音、震动
  • 原文地址:https://www.cnblogs.com/fly-book/p/11425105.html
Copyright © 2011-2022 走看看