JAVA常用设计模式(3)观察者模式
2016-10-31 16:10
645 查看
1. 引入
1.1官方定义:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。其又称为发布/订阅模式。观察者模式一般有2种,一种推模式,一种拉模式,推模式即当被订阅者对象发生行为改变时,会主动将变化的消息推给订阅者,而不考虑每个订阅者当时的处理能力,另一种比较好的是拉模式,即订阅者持有被观察者的实例,当被订阅者的行为发生改变时,拉模式会主动的根据引用获取变化的相关数据。
1.2观察者模式的结构(类图表示):
1.3 角色
被观察者:抽象观察者接口,包括观察者的注册,删除,通知等方法。观察者:定义观察者对象。
抽象观察者:定义观察者通用接口,当监听的被观察者发现行为改变时,动态的实现相应的行为动作。
具体观察者:定义具体的观察者对象
1.4 使用场景
当一个系统中某个对象的改变需要同时改变其他对象的时候当一个抽象模型中,其中一方面依赖于另一方面,需要分别封装到独立的对象中时,彼此独立于抽象模型中。
2.标准模板
/** * 被观察者:抽象观察者接口,包括观察者的注册,删除,通知等方法。 */ public class Subject { //保护注册的观察者对象 private List<Observer> observers = new ArrayList<Observer>(); public void attath(Observer observer){ observers.add(observer); } public void detach(Observer observer){ observers.remove(observer); } protected void notifyObservers(){ for(Observer observer:observers){ observer.update(this); } } } /** * 观察者 */ public interface Observer { public void update(Subject subject); } /** * ConcreteSubject */ public class ConcreteSubject extends Subject { //目标对象的状态 private String subjectState; public String getSubjectState() { return subjectState; } //通知观察者 public void setSubjectState(String subjectState) { this.subjectState = subjectState; this.notifyObservers(); } } /** * ConcreteObserver */ public class ConcreteObserver implements Observer { //观察者的状态 private String observerState; public void update(Subject subject) { observerState = ((ConcreteSubject)subject).getSubjectState(); } }
3.观察者模式实现
public class Weather { //创建观察者列表 private List<People> people = new ArrayList(); //添加观察者 public void attath(People people){ this.people.add(people); } //删除观察者 public void detach(People people){ this.people.remove(people); } //通知观察者更新 protected void updata(){ for(People human:people){ human.updata(this); } } } public class TodayWeather extends Weather{ //今日天气 private String weatherContext; public String getWeatherContext() { return weatherContext; } public void setWeatherContext(String weatherContext) { this.weatherContext = weatherContext; this.updata(); } } public interface People { //创建更新的接口 public void updata(Weather weather); } public class ConcretePeople implements People { private String infromation; private String name; private String talk; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTalk() { return talk; } public void setTalk(String talk) { this.talk = talk; } @Override public void updata(Weather weather) { infromation = ((TodayWeather) weather).getWeatherContext(); System.out.println(name + "说:今天" + infromation + talk); } } public class MainTest { public static void main(String[] args) { ConcretePeople man = new ConcretePeople(); man.setName("小强"); man.setTalk("应该出去踢球"); ConcretePeople woman = new ConcretePeople(); woman.setName("小红"); woman.setTalk("应该去逛街"); TodayWeather todayWeather = new TodayWeather(); todayWeather.setWeatherContext("天气晴朗,蓝天白云,没有雾霾!!"); man.updata(todayWeather); ae8b woman.updata(todayWeather); } }
结果:
小强说:今天天气晴朗,蓝天白云,没有雾霾!!应该出去踢球
小红说:今天天气晴朗,蓝天白云,没有雾霾!!应该去逛街
相关文章推荐
- 【Java常用类库】_观察者设计模式笔记
- Java常用类库--观察者设计模式( Observable类Observer接口)
- 最常用的Java设计之一 观察者模式 在android中的实例 ListView Adapter机制
- 【Java常用类库】_观察者设计模式笔记
- java常用类库续3(比较器Comparable、Comparator、观察者设计模式、正则表达式、定时调度)
- 11. JAVA常用类库 Part 4 (对象克隆技术clone、Arrays类、Comparable接口、比较器Comparator、观察者设计模式) ----- 学习笔记
- Java常用类库--观察者设计模式( Observable类Observer接口)
- Java技术常用设计模式(五)--- 观察者模式
- Java常用类库——观察者设计模式(Observer接口、Observable类)
- java常用设计模式(观察者模式)
- Java常用类库--观察者设计模式( Observable类Observer接口)
- Java设计模式16:常用设计模式之观察者模式(行为型模式)
- java常用设计模式
- All About JAVA 关于设计模式中的“观察者模式”
- Java中常用设计模式总结
- java设计模式--观察者模式和事件监听器模式
- Java设计模式 Design Pattern:观察者模式 Observer Pattern
- java常用的设计模式
- java常用的设计模式
- Java中几个常用设计模式