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

    最近看到安卓中一个功能的实现源码中用到了observer模式,就顺便总结一下。

    1、导入:如果一个对象的某种属性变化,想要让所有关注他的人感受到这种变化,这个时候可以考虑使用观察者模式,从这句话就可以读出,观察者模式的几个主要组成,主角(subject),粉丝(observer)。

    2、粉丝获取这种变化的方式有两种,第一种,自己去主动获取,第二种,让主角把内容拿过去一下,也就是拉和推两种方式。

    3、实现,这里采用java里边的的observer和observable两个类实现一下,observable就是主角,observer就是粉丝,以下实现以时间变化为例,时间的变化去通知学生。

    import java.util.Observable;
    
    public class TimeSubject extends Observable{
        private String curTime;
    
        public String getCurTime() {
            return curTime;
        }
    
        public void setCurTime(String curTime) {
            this.curTime = curTime;
            //通知观察者,必须首先调用setChanged
            this.setChanged();
            //主动通知观察者,第一种是推方法
            this.notifyObservers(curTime);
            //第二种是拉方式
            //this.notifyObservers();
        }
    
    }

    当时间有变化,去通知观察者学生,必须首先用setChanged标记,再调用notifyObservers通知观察者,

    import java.util.Observable;
    import java.util.Observer;
    
    public class StudentObserver implements Observer{
        private String observerName;
        
        public String getObserverName() {
            return observerName;
        }
    
        public void setObserverName(String observerName) {
            this.observerName = observerName;
        }
    
        public void update(Observable arg0, Object arg1) {
            //推的方式
            System.out.println(observerName +"获取到时间"+arg1);
            //拉的模式,直接去subject中去拉内容
            //System.out.println(((TimeSubject)arg0).getCurTime());
        }
    
    }

    观察者在个子的update函数中实现各自的操作处理

    public class Test {
    
        public static void main(String[] args) {
            final TimeSubject timeSubject = new TimeSubject();
            StudentObserver observer = new StudentObserver();
            observer.setObserverName("小明");
            
            StudentObserver observer2 = new StudentObserver();
            observer2.setObserverName("小张");
    
            timeSubject.addObserver(observer);
            timeSubject.addObserver(observer2);
            
            new Thread(){
                public void run() {
                    
                    while(true){
                        timeSubject.setCurTime(new Date().toGMTString());
                        try {
                            sleep(1000);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                    
                }
            }.start();
    
        }
    
    }

    主函数进行测试,将观察者和主角联系起来分四步走:

    (1)创建主角对象

    (2)创建观察者们

    (3)将观察者们attach到主角身上

    (4)调用主角的方法(方法中实现notifyObservers)通知各个观察者

    于是乎,所有的观察者们都得到了主角的消息

  • 相关阅读:
    494. Target Sum 添加标点符号求和
    636. Exclusive Time of Functions 进程的执行时间
    714. Best Time to Buy and Sell Stock with Transaction Fee有交易费的买卖股票
    377. Combination Sum IV 返回符合目标和的组数
    325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
    275. H-Index II 递增排序后的论文引用量
    274. H-Index论文引用量
    RabbitMQ学习之HelloWorld(1)
    java之struts2的数据处理
    java之struts2的action的创建方式
  • 原文地址:https://www.cnblogs.com/hpustudent/p/4592516.html
Copyright © 2011-2022 走看看