设计模式_观察者模式
观察者模式的实现由好几种,其中最简单的一种是java的SDK自带的一种,这里均介绍下,如果不完整可以参考本站“文件”板块上传的观察者模式rar包中的内容来理解,先来个自带的实现代码
package com.observer; import java.util.Observable; /** * Observable类是java自带的,他里面的setChanged(),notifyObservers(weatherContent)用来设置改变跟通知,内部已经实现了,所以我们只管调用即可 * Created by wuyawei on 2017/5/9. */ public class CreateWeather extends Observable { private String weatherContent; public String getWeatherContent() { return weatherContent; } public void setWeatherContent(String weatherContent) { this.weatherContent = weatherContent; this.setChanged(); this.notifyObservers(weatherContent); } }
package com.observer; import java.util.Observable; import java.util.Observer; /** * Created by wuyawei on 2017/5/9. */ public class CreateObserv implements Observer { /*观察者名称,比如谁是观察者*/ private String observerName; public String getObserverName() { return observerName; } public void setObserverName(String observerName) { this.observerName = observerName; } @Override public void update(Observable o, Object arg) { System.out.println(this.observerName+"目标推送过来的是:"+arg); System.out.println(this.observerName+"收到的消息内容是:"+((CreateWeather)o).getWeatherContent()); } }
package com.observer; /** * Created by wuyawei on 2017/5/9. */ public class Test { public static void main(String[] args) { //创建天气作为一个目标 CreateWeather createWeather = new CreateWeather(); //创建两个观察者对象 CreateObserv grilFrend = new CreateObserv(); grilFrend.setObserverName("gril frends"); CreateObserv mum = new CreateObserv(); mum.setObserverName("mum"); //注册观察者 createWeather.addObserver(grilFrend); createWeather.addObserver(mum); //更新天气状况 createWeather.setWeatherContent("今天下雨了"); } }
自定义实现观察者模式
package com.ovserver01; import java.util.ArrayList; import java.util.List; /** * Created by wuyawei on 2017/5/9. */ public class Subject { private List<Observer> observerList = new ArrayList<>(); /** * 添加观察者对象 */ public void addObserver(Observer observer){ observerList.add(observer); } /** * 删除观察者对象 */ public void deleteObserver(Observer observer){ observerList.remove(observer); } /** * 通过所有注册的观察者对象 */ public void notifyObservers(){ for(Observer observer : observerList){ observer.update(this); } } }
package com.ovserver01; /** * 这是一个观察者接口,定义一个更新的接口给那些在目标发生变化时被通知的对象 * Created by wuyawei on 2017/5/9. */ public interface Observer { public void update(Subject subject); }
package com.ovserver01; /** * 具体的目标对象,负责把有关状态存入到相应的观察者对象中 * Created by wuyawei on 2017/5/9. */ public class CreateSubject extends Subject { //获取天气内容信息 private String subjectStatus; public String getSubjectStatus() { return subjectStatus; } public void setSubjectStatus(String subjectStatus) { this.subjectStatus = subjectStatus; this.notifyObservers(); } }
package com.ovserver01; /** * Created by wuyawei on 2017/5/9. */ public class CreateObserver implements Observer { // 定义观察者的名字,都有哪些人关注天气 private String observerStutas; //天气信息,此信息从目标处获取 private String weatherContent; //消息内容,每个观察者提醒的内容不相同,就是每个观察天气的人收到天气信息后要做什么 private String madeSomething; /** * 获取目标类状态同步到观察者的状态中 */ @Override public void update(Subject subject) { weatherContent = ((CreateSubject)subject).getSubjectStatus(); System.out.println(observerStutas+"收到的"+weatherContent +"然后他们去"+ madeSomething); } public String getObserverStutas() { return observerStutas; } public void setObserverStutas(String observerStutas) { this.observerStutas = observerStutas; } public String getWeatherContent() { return weatherContent; } public void setWeatherContent(String weatherContent) { this.weatherContent = weatherContent; } public String getMadeSomething() { return madeSomething; } public void setMadeSomething(String madeSomething) { this.madeSomething = madeSomething; } }
test
package com.ovserver01; /** * Created by wuyawei on 2017/5/9. */ public class Test { public static void main(String[] args) { /**创建目标*/ CreateSubject createSubject = new CreateSubject(); /**创建观察者并且注册*/ CreateObserver grilFrend = new CreateObserver(); grilFrend.setObserverStutas("女票"); grilFrend.setMadeSomething("约会"); CreateObserver brother = new CreateObserver(); brother.setObserverStutas("兄弟"); brother.setMadeSomething("打麻将"); /**注册观察者*/ createSubject.addObserver(grilFrend); createSubject.addObserver(brother); /**发布天气信息*/ createSubject.setSubjectStatus("天气状况为良好"); } }
暂时用这两种实现,其他版本的实现方法都是大同小异,本人已在本博客的文件中上传了,有兴趣可以下载参考