理解
观察者模式:一种一对多的方式,类似报纸和订阅报纸的人,报纸每次发布一个新的版本,都会通知到订阅报纸的人。主题和订阅者都是按接口的方式联系,可以轻松的增加主题和增加订阅者,只要实现一个固定的接口
代码
java 接口实现
//观察者接口
public interface Observer {
void update(String object);
}
//观察者实现
public class ObServerA implements Observer {
public void subscribe(Subject subject){
subject.addObserver(this);
}
@Override
public void update(String object) {
System.out.println("收到信息message "+object);
}
}
//主题接口
public interface Subject {
void broadcast();
void addObserver(Observer observer);
void removeObserver(Observer observer);
}
//主题实现
public class SubjectA implements Subject{
private String message;
private List<Observer> observerList=new ArrayList<>();
@Override
public void broadcast() {
for(Observer observerVar : observerList){
observerVar.update(message);
}
}
@Override
public void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observerList.remove(observer);
}
public void setMessage(String var){
this.message=var;
broadcast();
}
}
//客户端
public void client(){
ObServerA observer=new ObServerA();
Subject subject=new SubjectA();
observer.subscribe(subject);
((SubjectA) subject).setMessage("123123");
}
java api实现方式
@Getter
@ToString
public class SubjectJava extends Observable {
private String message;
public void setMessage(String var){
message=var;
setChanged();
notifyObservers(message);
}
}
public class ObserverJava implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(o);
System.out.println(arg);
}
}
@Test
public void client2(){
java.util.Observer observer=new ObserverJava();
SubjectJava observable=new SubjectJava();
observable.addObserver(observer);
observable.setMessage("1111");
}
guava实现方式
public class ObserverGuava {
@Subscribe
public void upate(SubjectGuava subjectGuava){
System.out.println(subjectGuava.getMessage());
}
}
@Data
public class SubjectGuava {
private String message;
}
@Test
public void client3(){
EventBus eventBus=new EventBus();
ObserverGuava observerGuava=new ObserverGuava();
eventBus.register(observerGuava);
SubjectGuava subjectGuava=new SubjectGuava();
subjectGuava.setMessage("123123");
eventBus.post(subjectGuava);
}