黑马程序员技术交流社区
标题: [黑马程序员杭州] 观察者模式 [打印本页]
作者: 小江哥 时间: 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.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 |