黑马程序员技术交流社区

标题: [黑马程序员杭州] 观察者模式 [打印本页]

作者: 小江哥    时间: 2017-11-28 14:36
标题: [黑马程序员杭州] 观察者模式
本帖最后由 小江哥 于 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那么咱们学会的观察者模式之后,他一般在那种情况下使用呢?
最后相信大家对观察者模式有了一定的了解,我们下次再见。








作者: 小年青    时间: 2017-11-28 14:49
棒棒的棒棒的
作者: gy_yt    时间: 2017-11-28 14:50
干货,收藏收藏
作者: 猫先森    时间: 2017-11-28 14:50
哇,可以。又学会了一个新知识
作者: nhm    时间: 2017-11-28 14:50
很好写的很详细
作者: 鱼丸儿    时间: 2017-11-28 14:50
对学习很有帮助 顶顶顶
作者: 咸鱼666    时间: 2017-11-28 14:50
6666666很实用
作者: 许言    时间: 2017-11-28 14:52
顶顶顶顶顶
作者: 采姑娘的小蘑菇    时间: 2017-11-28 14:52
咯就咔啾  满满的干货 燃起了我对知识的渴望
作者: 从此学好    时间: 2017-11-28 14:55
日常干货之设计模式,棒棒的
作者: 黑马小黄人    时间: 2017-11-28 14:56
没毛病 66666666
作者: fanbuer    时间: 2017-11-28 14:57
不错,很详细
作者: 阿布乙    时间: 2017-11-28 14:57
期待集齐23种模式
作者: fangmifang618    时间: 2017-11-28 14:59
虽然不懂,但是还是觉得很厉害啊
作者: yuxiaoyi    时间: 2017-11-28 15:00
很详细,赞
作者: 刘华莎    时间: 2017-11-28 15:00
棒棒哒
作者: huangjinchao.ar    时间: 2017-11-28 15:08
帖子思路清晰,学习必备良品
作者: 张艺凡老师    时间: 2017-11-28 15:12
棒棒哒
作者: 秋子菇凉    时间: 2017-11-28 15:14
不明觉厉!棒棒哒
作者: 黑马6666    时间: 2017-11-28 16:25
好好好有用!!!
作者: 小核桃仁    时间: 2017-11-28 18:23
棒棒哒
作者: 程代明    时间: 2017-11-28 18:44
可以的   
作者: 慧-wh    时间: 2017-11-28 19:19
写的真不错!赞




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2