设计模式-----观察者模式(一)
学习观察者模式的通用代码;
步骤:
第一:是目标对象的定义;
第二:是具体目标对象的定义;
第三:观察者的接口定义;
第四:看看观察者的具体实现;
通用的代码如下:
Subject.java
import java.util.ArrayList; import java.util.List; /* * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口 * */ public class Subject { //这个集合是用来保存注册的观察者对象; private List<Observer> observers = new ArrayList<Observer>(); //attach detach notifyObservers public void attach(Observer observer){ observers.add(observer); } /* * 删除集合中的指定观察者; */ public void detach(Observer observer){ observers.remove(observer); } /* * 通知所有注册的观察者对象; */ protected void notifyObesrvers(){ for(Observer observer:observers){ observer.update(this); } } }
ConcreteSubject.java
/* * 具体的目标对象,负责把有关状态存入到响应的观察者对象 * * */ public class ConcreteSubject extends Subject{ //目标对象的状态; private String subjectState; public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; this.notifyObesrvers(); } }
Observer.java
/* *这是一个观察者接口,定义一个更新的接口给那些 在目标改变的时候被通知的对象; * */ public interface Observer { /* * * 更新的接口 * @param subject 传入目标对象,方便获取相应的目标对象的状态 */ public void update(Subject subject); }
ConcreteObserver.java
/* * * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致; * * */ public class ConcreteObserver implements Observer { private String observerState; @Override /** * 获取目标类的状态同步到观察者类中; */ public void update(Subject subject) { observerState = ((ConcreteSubject)subject).getSubjectState(); } }
改造通用的代码如下:
WeatherSubject.java
import java.util.ArrayList; import java.util.List; /* * 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口 * */ public class WeatherSubject { //这个集合是用来保存注册的观察者对象; private List<Observer> observers = new ArrayList<Observer>(); //attach detach notifyObservers; //把订阅天气的人,添加到订阅者列表中; public void attach(Observer observer){ observers.add(observer); } /* * 删除集合中的指定订阅天气的人; */ public void detach(Observer observer){ observers.remove(observer); } /* * 通知所有注册的订阅了天气的人; */ protected void notifyObesrvers(){ for(Observer observer:observers){ observer.update(this); } } }
ConcreteWeatherSubject.java
/* * 具体的目标对象,负责把有关状态存入到响应的观察者对象 * * */ public class ConcreteWeatherSubject extends WeatherSubject{ //获取天气的内容 private String WeatherContent; public String getWeatherContent() { return WeatherContent; } public void setWeatherContent(String weatherContent) { WeatherContent = weatherContent; //内容有了,说明天气更新了,通知所有订阅了天气的人; this.notifyObesrvers(); } }
Observer.java
/* *这是一个观察者接口,定义一个更新的接口给那些 在目标改变的时候被通知的对象; */ public interface Observer { /* * 更新的接口 * @param subject 传入目标对象,方便获取相应的目标对象的状态 */ public void update(WeatherSubject subject); }
ConcreteObserver.java
/* * * 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致; * * */ public class ConcreteObserver implements Observer { //观察者的名字,是黄明的女朋友还是老妈; private String observerName; //根据内容的情况,这个消息从目标获取; private String WeatherContent; //提醒的内容;女朋友提醒约会,老妈提醒购物; private String remindThing; public String getObserverName() { return observerName; } public void setObserverName(String observerName) { this.observerName = observerName; } public String getWeatherContent() { return WeatherContent; } public void setWeatherContent(String weatherContent) { WeatherContent = weatherContent; } public String getRemindThing() { return remindThing; } public void setRemindThing(String remindThing) { this.remindThing = remindThing; } @Override /** * 获取目标类的状态同步到观察者类中; */ public void update(WeatherSubject subject) { WeatherContent = ((ConcreteWeatherSubject)subject).getWeatherContent(); System.out.println(observerName+"收到了"+WeatherContent+"提醒的内容"+remindThing); } }
test.java
public class test { /** * @param args */ public static void main(String[] args) { //创建目标 ConcreteWeatherSubject weather = new ConcreteWeatherSubject(); //创建观察者 ConcreteObserver observergirl = new ConcreteObserver(); observergirl.setObserverName("girl"); observergirl.setRemindThing("约会了"); ConcreteObserver observermother = new ConcreteObserver(); observermother.setObserverName("mohter"); observermother.setRemindThing("购物了"); //注册观察者 weather.attach(observergirl); weather.attach(observermother); //目标发布天气 weather.setWeatherContent("明天天气晴朗"); } }