您的位置:首页 > 编程语言 > Java开发

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 设计模式