package com.hm.demo;
import java.util.ArrayList;
import java.util.List;
/**
* 你自己
* 它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
*/
public abstract class Subject {
private List<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
System.out.println("我新交了女朋友:"+observer.getName());
}
public void dettach(Observer observer) {
observers.remove(observer);
System.out.println("我和 "+observer.getName() +" 分手了");
}
/**
* 通知更新所有状态
* @param state
*/
public void notifyALl(String state) {
for (Observer observer : observers) {
observer.update(state);
}
}
}
以上为抽象主题,在抽象主题中有一个List是用来存放观察者的,attach和dettach分别是增加删除观察者。notifyALl是用来遍历所有观察者,并给他们发送最新状态。
由于这个是抽象的主题,所以我们需要new对象就必须创建一个正常的类并继承这个抽象主题类,里面就只有一个update方法,直接调用抽象主题的notifyALl方法。
package com.hm.demo;
/**
* 将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
*/
public class MessageSubject extends Subject {
public void update(String state) {
notifyALl(state);
}
}
在观察者定义update接口,并且定义getName的接口,用来给具体观察者传入姓名
package com.hm.demo;
/**
* 你女朋友
* 为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
*/
public interface Observer {
String getName();
void update(String state);
}
具体观察者实现接口
package com.hm.demo;
/**
* 具体某个女朋友
* 实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
*/
public class GFObserver implements Observer{
private String name;
public String getName() {
return name;
}
public GFObserver(String name) {
this.name = name;
}
@Override
public void update(String state) {
System.out.println(this.name + "接收到新消息,男朋友最新状态:" + state);
}
}
package com.hm.demo;
public class Client {
public static void main(String[] args) {
Observer sunnyObserver = new GFObserver("sunny");
Observer maryObserver = new GFObserver("mary");
MessageSubject subject = new MessageSubject();
subject.attach(sunnyObserver);
subject.attach(maryObserver);
subject.update("我在写代码");
subject.dettach(maryObserver);
subject.update("我在睡觉");
}
}
观察者模式的实现大概是这样的思路:
首先是抽象主题持有一个list,这个list存着所有的观察者(你的所有女朋友),你可以在这里增加删除你的女朋友,这里你还需要向你所有女朋友汇报你的最新状态,遍历list,调用update接口。
然后在具体的女朋友那里实现update方法,那么你发出的最新状态就能在具体的女朋友那里实现update方法中接收到。感觉这个就是接口回调的一个实现。