A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小江哥 黑马粉丝团   /  2017-11-28 14:36  /  3224 人查看  /  22 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小江哥 于 2017-11-28 14:52 编辑

1.Java有23中设计模式,今天就来和大家一起来一下其中的观察者模式
1.1什么是观察者模式?
        定义对象的一种一对多的关系,当对象状态发生改变时,所有依赖他的对象都得到通知并被自动更新
1.2可能概念不能够很好的理解,那我们就一起来看一个案列吧
  

     如图所示,天气预报作为被观察观察者被张三,李四,王五观察,当被观察这也就是目标发生改变时,他所依赖的观察者(张三,李四..)就被被通知并被自动更新,收到新的天气预报,这就是所谓的观察者模式
1.3观察者模式的结构
观察者模式有两个结构,一个是观察者(就是案例中的张三,李四等等),另一个是目标就是被观察者(案例中的天气预报),他们中相应的结构就如图一样,目标有相应的添加减少观察者方法,还需要一个通知观察者的方法,而观察者只需要收到通知然后自动更新的方法就可以了,看了案例之后,那么在java中咱们怎么实现观察者模式呢?
1.4java中代码实现
[Java] 纯文本查看 复制代码
package com.heima.demo;
//具体的观察者对象,实现更新的方法,是自身的状态观察者的状态保持一致
public class ConcreteObserver implements Observer {

        private String observerState;
        @Override
        public void update(Subject subject) {

                observerState = ((ConcreteSubject)subject).getSubjectState();
        }

}
[Java] 纯文本查看 复制代码
package com.heima.demo;
//具体的目标对象
public class ConcreteSubject extends Subject {
        
        //目标对象状态
        private String subjectState;

        public String getSubjectState() {
                return subjectState;
        }

        public void setSubjectState(String subjectState) {
                this.subjectState = subjectState;
                this.notifyObserver();
        }
}

[AppleScript] 纯文本查看 复制代码
package com.heima.demo;
//观察者接口,定义一个更新接口给那些在目标发生改变的时候被通知的对象
public interface Observer {

        //观察者更新的接口,subject获得目标的状态
        public void update(Subject subject);

}

[Java] 纯文本查看 复制代码
package com.heima.demo;

import java.util.ArrayList;
import java.util.List;

//目标对象,维护观察他的观察者,并提供添加和删除观察者
public class Subject {
        //用来保存注册的观察者对象
        private List<Observer> observers = new ArrayList<Observer>();
        
        //添加观察者
        public void attach(Observer observer){
                observers.add(observer);
        }
        
        //删除观察者
        public void detach(Observer observer){
                observers.remove(observer);
        }
        
        //通知所有注册的观察这对象
        protected void notifyObserver() {
                for (Observer observer : observers) {
                        observer.update(this);
                }
        }
}

通过上面的代码咱么是不是就用java实现的观察者模式呢,是的没有错,但是这是咱们自己定义的相应的接口,其实java中已经帮咱们定义好了相应的接口,他们就在Java.util   包中的Observable类 Oberver接口update方法,那么咱们具体怎么用呢。现在咱们就用java定义的好接口实现咱们的案例
1.5java实现案例代码
[Java] 纯文本查看 复制代码
package com.heima.weather;

import java.util.Observable;
import java.util.Observer;

public class WeatherObserver implements Observer {

        //名称
        private String name;
        
        //第一个参数是目标引用采用拉方式。第二个是推送方式(推送的内容)
        @Override
        public void update(Observable o, Object arg) {
                //推方式
                System.out.println(name+"收到了消息,目标推送过来的参数是"+arg);
                //拉方式
                System.out.println(name+"收到消息,主动到目标对象中拉到了"+((WeatherSubject)o).getContent());
        }
        
        

        public String getName() {
                return name;
        }


        public void setName(String name) {
                this.name = name;
        }

}

[Java] 纯文本查看 复制代码
package com.heima.weather;

import java.util.Observable;
//天气目标的具体实现类
public class WeatherSubject extends Observable {
        //消息天气情况
        private String content;

        public String getContent() {
                return content;
        }

        public void setContent(String content) {
                this.content = content;
                //这句话不可少
                this.setChanged();
                //通知观察者、推模型
                this.notifyObservers(content);
                //通知观察者、拉模型
                // this.notifyObservers();
        }
        
}

没错咱们现在使用了jdk提供的接口之后,咱们的案例就变的这么简单,咱们看过了案例的代码,那么咱们再来总结下咱们观察者模式的知识点
1.61 目标与观察者之间的关系
              一个观察者观察多个目标,多个观察者观察一个目标
    1.62 单项依赖
    1.63 观察者单项依赖目标
              触发通知时机先设置消息在通知
    1.64观察者调用顺序示意
1.7观察这实现的两种方式
        推模型
              目标对象主动向观察者推送目标的详细信息(直街传数据)
        拉模型
              目标对象在通知观察者的时候,只传递少量信息   如果观察者需要更多信息,需要自己到目标中获取(传对象自己获取)
1.8观察者模式的优缺点
1.8那么咱们学会的观察者模式之后,他一般在那种情况下使用呢?
最后相信大家对观察者模式有了一定的了解,我们下次再见。







22 个回复

倒序浏览
您需要登录后才可以回帖 登录 | 加入黑马