1、使用java提供的观察者进行实现
//继承java本身的父类获得目标具体实现类
public class concreteSubjectForJava extends Observable {
//目标对象更新的内容
private String weatherContent;
public String getWeatherContent() {
return weatherContent;
}
public void setWeatherContent(String weatherContent) {
this.weatherContent = weatherContent;
//必须先调用此方法
this.setChanged();
//这里无论调用推模型还是拉模型都会将目标对象传递到观察者更新的方法中
//拉模型
// this.notifyObservers();
//推模型
this.notifyObservers(this.weatherContent);
}
}
//实现java观察者接口获得具体观察者实现类
public class concreteObserverForJava implements Observer {
//观察者的名字,是谁收到了消息
private String observerName;
//目标对象更新的内容
private String weatherContent;
//观察者获取目标通知后做出的提醒
private String remindThing;
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println(observerName + "获得推送的天气消息【" + arg + "】," + remindThing);
System.out.println(observerName + "自己拉取天气消息【" + ((concreteSubjectForJava)o).getWeatherContent() + "】," + remindThing);
}
public String getObserverName() {
return observerName;
}
public void setObserverName(String observerName) {
this.observerName = observerName;
}
public String getWeatherContent() {
return weatherContent;
}
public void setWeatherContent(String weatherContent) {
this.weatherContent = weatherContent;
}
public String getRemindThing() {
return remindThing;
}
public void setRemindThing(String remindThing) {
this.remindThing = remindThing;
}
}
2、区别对待观察者模式:根据具体需求判断是否需要通知对应的观察者
场景:黄明的女朋友只需要收到“下雨”的天气情况,黄明的老妈需要收到“下雨”和“下雪”的天气情况
/**
* 目标对象,它知道观察它的观察者,并提供注册和删除观察者的接口
*
*/
public abstract class WeatherSubject {
//用来保存注册的观察者模式对象
List<Observer> observes = new ArrayList<Observer>();
//将观察者添加到观察者对象列表
public void attach(Observer observe){
observes.add(observe);
}
//删除集合中的指定观察者
public void detach(Observer observe){
observes.remove(observe);
}
//根据需求通知注册的观察者对象
protected abstract void notifyObserves();
}
/**
* 具体的目标对象,负责把有关状态存入到相应的观察者中
* *
*/
public class ConcreteWeatherSubject extends WeatherSubject{
//目标对象的状态
private String weatherContent;
public String getWeatherContent() {
return weatherContent;
}
public void setWeatherContent(String weatherContent) {
this.weatherContent = weatherContent;
//内容有了,说明天气更新了,通知所有订阅的人
this.notifyObserves();
}
@Override
protected void notifyObserves() {
for(Observer observer : this.observes){
if("下雨".equals(this.getWeatherContent())){
if("黄明的女朋友".equals(observer.getObserverName())){
observer.update(this);
}
if("黄明的老妈".equals(observer.getObserverName())){
observer.update(this);
}
}else if("下雪".equals(this.getWeatherContent())){
if("黄明的老妈".equals(observer.getObserverName())){
observer.update(this);
}
}
}
}
}
/**
* 这是一个观察者接口,定义一个更新的接口给那些在目标状态发生改变时被通知的观察者对象调用
* *
*/
public interface Observer {
/**
* 更新的接口,传入目标对象,方便获取相应的目标对象的状态
*/
public void update(WeatherSubject subject);
//设置观察者的名称
public void setObserverName(String observerName);
//获取观察者的名称
public String getObserverName();
}
/**
*
* 具体的观察者,实现更新的方法,是自己的状态和目标的状态保持一致
*/
public class ConcreteObserver implements Observer{
//观察者的名字,是谁收到了这条信息
private String observerName;
//目标对象通知的内容
private String weatherContent;
//观察者接到通知后做出的提醒
private String remindThing;
/**
* 获取目标对象的状态同步到观察者通知
*/
@Override
public void update(WeatherSubject subject) {
// TODO Auto-generated method stub
weatherContent = ((ConcreteWeatherSubject)subject).getWeatherContent();
System.out.println(observerName + "收到了" + weatherContent + "," + remindThing);
}
@Override
public String getObserverName() {
return observerName;
}
@Override
public void setObserverName(String observerName) {
this.observerName = observerName;
}
public String getWeatherContent() {
return weatherContent;
}
public void setWeatherContent(String weatherContent) {
this.weatherContent = weatherContent;
}
public String getRemindThing() {
return remindThing;
}
public void setRemindThing(String remindThing) {
this.remindThing = remindThing;
}
}
/区别对待观察者测试
public class ObserverTest {
public static void main(String[] args) {
//1、创建目标
ConcreteWeatherSubject weather = new ConcreteWeatherSubject();
//2、创建观察者
ConcreteObserver observerGirl = new ConcreteObserver();
observerGirl.setObserverName("黄明的女朋友");
observerGirl.setRemindThing("下雨了,安静的呆在家里吧");
ConcreteObserver observerMum = new ConcreteObserver();
observerMum.setObserverName("黄明的老妈");
observerMum.setRemindThing("下雨还是下雪,都不出门了");
//3、注册观察者
weather.attach(observerGirl);
weather.attach(observerMum);
//4、发布天气
weather.setWeatherContent("下雨");
weather.setWeatherContent("下雪");
// weather.setWeatherContent("晴天");
}
}