首页 > 其他分享 >观察者模式

观察者模式

时间:2022-12-12 16:33:32浏览次数:42  
标签:String observer 对象 void 观察者 模式 public


观察者模式的定义

定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,

所有依赖它的对象都得到通知并被自动更新。

推模型

目标对象主动向观察者推送目标的详细信息,推送的信息通常是目标对象

的全部或部分数据。

两种模型做个比较

推模型是假定目标对象知道观察者需要的数据

拉模型是目标对象不知道观察者具体需要什么数据,因此把自身传给

观察者,由观察者取值。

拉模型案例,把天气情况通知给观察者。

/**
* 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口
*/
public class Subject {
//用来保存注册的观察者对象
private List<Observer> observers=new ArrayList<>();
public void attach(Observer observer){
observers.add(observer);
}

/**
* 删除集合中的指定观察者
* @param observer
*/
public void detach(Observer observer){
observers.remove(observer);
}

/**
* 通知所有注册的观察者对象
*/
protected void notifyObservers(){
for(Observer observer:observers){
observer.update(this);
}
}
}
/**
* 具体的目标对象,负责把有关状态存入到相应的观察者对象中
*/
public class ConcreteSubject extends Subject {
//目标对象的状态
private String subjectState;

public String getSubjectState() {
return subjectState;
}

public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
this.notifyObservers();
}
}
/**
* 这是一个观察者接口,定义更新的接口
* 给那些在目标发生变化的时候被通知的对象
*/
public interface Observer {
/**
* 更新的接口
* 传入目标对象,方便获取相应的目标对象的状态
* @param subject
*/
void update(Subject subject);
}
/**
* 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保证一直
*/
public class ConcreteObserver implements Observer {
//观察者的状态
private String observerState;

private String name;
private String event;
/**
* 获取目标类的状态同步到观察者的状态中
* @param subject
*/
@Override
public void update(Subject subject) {
observerState=((ConcreteSubject)subject).getSubjectState();
System.out.println(name+"收到了,"+observerState);
System.out.println("他要去"+event);
}

public String getEvent() {
return event;
}

public void setEvent(String event) {
this.event = event;
}

public String getName() {

return name;
}

public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args){
//1创建目标
ConcreteSubject weather=new ConcreteSubject();
//2创建观察者
ConcreteObserver girlfriend=new ConcreteObserver();
girlfriend.setName("女朋友");
girlfriend.setEvent("去约会");

ConcreteObserver mum=new ConcreteObserver();
mum.setName("老妈");
mum.setEvent("逛街去");
//3注册观察者
weather.attach(girlfriend);
weather.attach(mum);
//4目标发布天气
weather.setSubjectState("明天天气多云,气温28度。");
}
}

推模型:

/**
* 目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口
*/
public class Subject {
//用来保存注册的观察者对象
private List<Observer> observers=new ArrayList<>();
public void attach(Observer observer){
observers.add(observer);
}

/**
* 删除集合中的指定观察者
* @param observer
*/
public void detach(Observer observer){
observers.remove(observer);
}

/**
* 通知所有注册的观察者对象
*/
protected void notifyObservers(String content){
for(Observer observer:observers){
observer.update(content);
}
}
}
/**
* 具体的目标对象,负责把有关状态存入到相应的观察者对象中
*/
public class ConcreteSubject extends Subject {
//目标对象的状态
private String subjectState;

public String getSubjectState() {
return subjectState;
}

public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
this.notifyObservers(subjectState);
}
}
/**
* 这是一个观察者接口,定义更新的接口
* 给那些在目标发生变化的时候被通知的对象
*/
public interface Observer {
/**
* 更新的接口
* 传入目标对象,方便获取相应的目标对象的状态
*
*/
void update(String content);
}
/**
* 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保证一直
*/
public class ConcreteObserver implements Observer {
//观察者的状态
private String observerState;

private String name;
private String event;
/**
* 获取目标类的状态同步到观察者的状态中
*
*/
@Override
public void update(String content) {
observerState=content;
//observerState=((ConcreteSubject)subject).getSubjectState();
System.out.println(name+"收到了,"+observerState);
System.out.println("他要去"+event);
}

public String getEvent() {
return event;
}

public void setEvent(String event) {
this.event = event;
}

public String getName() {

return name;
}

public void setName(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args){
//1创建目标
ConcreteSubject weather=new ConcreteSubject();
//2创建观察者
ConcreteObserver girlfriend=new ConcreteObserver();
girlfriend.setName("女朋友");
girlfriend.setEvent("去约会");

ConcreteObserver mum=new ConcreteObserver();
mum.setName("老妈");
mum.setEvent("逛街去");
//3注册观察者
weather.attach(girlfriend);
weather.attach(mum);
//4目标发布天气
weather.setSubjectState("明天天气多云,气温28度。");
}
}



标签:String,observer,对象,void,观察者,模式,public
From: https://blog.51cto.com/u_12026373/5930809

相关文章