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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小江哥 黑马粉丝团   /  2017-11-28 14:36  /  3186 人查看  /  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 个回复

倒序浏览
棒棒的棒棒的
回复 使用道具 举报
干货,收藏收藏
回复 使用道具 举报
猫先森 来自手机 中级黑马 2017-11-28 14:50:06
板凳
哇,可以。又学会了一个新知识
回复 使用道具 举报
nhm 中级黑马 2017-11-28 14:50:14
报纸
很好写的很详细
回复 使用道具 举报
对学习很有帮助 顶顶顶
回复 使用道具 举报
咸鱼666 来自手机 中级黑马 2017-11-28 14:50:55
7#
6666666很实用
回复 使用道具 举报
许言 来自手机 中级黑马 2017-11-28 14:52:15
8#
顶顶顶顶顶
回复 使用道具 举报
咯就咔啾  满满的干货 燃起了我对知识的渴望
回复 使用道具 举报
日常干货之设计模式,棒棒的
回复 使用道具 举报
没毛病 66666666
回复 使用道具 举报
fanbuer 来自手机 中级黑马 2017-11-28 14:57:40
12#
不错,很详细
回复 使用道具 举报
阿布乙 来自手机 中级黑马 2017-11-28 14:57:58
13#
期待集齐23种模式
回复 使用道具 举报
fangmifang618 来自手机 中级黑马 2017-11-28 14:59:14
14#
虽然不懂,但是还是觉得很厉害啊
回复 使用道具 举报
yuxiaoyi 来自手机 中级黑马 2017-11-28 15:00:08
15#
很详细,赞
回复 使用道具 举报
刘华莎 来自手机 中级黑马 2017-11-28 15:00:48
16#
棒棒哒
回复 使用道具 举报
帖子思路清晰,学习必备良品
回复 使用道具 举报
张艺凡老师 来自手机 中级黑马 2017-11-28 15:12:10
18#
棒棒哒
回复 使用道具 举报
秋子菇凉 来自手机 中级黑马 2017-11-28 15:14:44
19#
不明觉厉!棒棒哒
回复 使用道具 举报
黑马6666 来自手机 初级黑马 2017-11-28 16:25:49
20#
好好好有用!!!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马