本帖最后由 小江哥 于 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那么咱们学会的观察者模式之后,他一般在那种情况下使用呢? 最后相信大家对观察者模式有了一定的了解,我们下次再见。
|