zoukankan      html  css  js  c++  java
  • 模式的秘密-观察者模式(三)

    利用Java提供的观察者实现

    java.utill包:Observable类。

    接口:Observer  update方法。

    Java实现与自己实现的对比。

    四点:

    第一:不需要再定义观察者和目标的接口,JDK帮忙定义。

    第二:具体的目标实现不需要维护观察者的注册信息了,这个Java中Observable类里面以及帮忙实现好了。

    第三:触发通知的方式有一点变化,需要先调用setChanged方法,这个是Java为了帮助实现更精确的触发控制而提供的功能。

    第四:具体观察者的实现里面,update方法其实能同时支持推模型和拉模型,这个在Java定义的时候,以及考虑进去了。

    利用Java提供的观察者实现:

    第一步:创建具体实现类,继承观察类

    注意:在通知之前,在用java中的observer模式的时候,下面这句话不可少。

    通知调用this.notifyObservers,如果是推的,需要传入参数,如果是拉的,不需要传参数。

    package com.WeatherJavaObserverPattern;
    import java.util.Observable;
    
    //天气目标的具体实现类
    public class ConcreteWeatherSubject extends Observable {
        //天气情况的内容
        private String content;
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
            //天气情况有了,就要通知所有的观察者
            
            //注意:在通知之前,在用java中的observer模式的时候,下面这句话不可少
            this.setChanged();
            
            //然后主动通知,这里先用推的方式
            this.notifyObservers(content);
            
            //如果是拉的方式,我们用
            //this.notifyObservers();
        }
    }

    第二步:创建观察者对象。

    注意:重写update方法。

    package com.WeatherJavaObserverPattern;
    
    import java.util.Observable;
    import java.util.Observer;
    
    //具体的观察者对象
    public class ConcreteObserver implements Observer {
    
        //观察者名称的变量
        private String observerName;
        
        public String getObserverName() {
            return observerName;
        }
        public void setObserverName(String observerName) {
            this.observerName = observerName;
        }
        @Override
        public void update(Observable o, Object arg) {
            //第一种是推的方式
            System.out.println(observerName+"手动的消息,目标推送过来的是"+arg);
            //第二种是拉的方式
            //System.out.println(observerName+"手动的消息,主动到目标对象中去拉,拉的内容是"+
            //        ((ConcreteWeatherSubject)o).getContent());
        }
    }

    测试:

    package com.WeatherJavaObserverPattern;
    
    //测试类
    public class Client {
    
        public static void main(String[] args) {
    
            //创建天气作为一个目标,也可以说是被观察患者
            ConcreteWeatherSubject subject=new ConcreteWeatherSubject();
            
            //创建黄明的女朋友作为观察者
            ConcreteObserver girl=new ConcreteObserver();
            girl.setObserverName("黄明女朋友");
            //创建黄明的老妈作为观察者
            ConcreteObserver Mum=new ConcreteObserver();
            Mum.setObserverName("黄明老妈");
            
            //注册观察者
            subject.addObserver(girl);
            subject.addObserver(Mum);
            
            //目标更新天气情况
            subject.setContent("天气晴,气温28度");
        }
    
    }

    观察者优缺点

    优点:

    实现了观察者和目标之间的抽象耦合。

    实现类动态联动。

    支持广播通信。

    确定:

    可能引起无谓的操作(不一定每个用户都要执行update)。

    何时使用观察者

    建议在以下情况选用观察者模式

    1,当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化。

    2,如果在更改一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有多少对象需要被连带改变。

    3,当一个对象必须通知其他的对象,但是你又希望这个对象和其他被通知的对象是松散耦合的。

  • 相关阅读:
    进击的UI------------UIToolBar(bottom导航条)
    进击的UI-------------------UIPageControl(滑动控制)
    进击的UI---------------------UIStepper(加减)
    进击的UI--------------UIActionSheet(提示)
    python生成固定格式且不会重复的用户名
    python多判断if,elif语句优化
    python代码出现异常,自动重新运行
    批处理+adb命令实现Android截图小工具
    python爬取百度图片后自动上传
    map和filter函数
  • 原文地址:https://www.cnblogs.com/alsf/p/8947915.html
Copyright © 2011-2022 走看看