一。场景
公司里有的员工打游戏,有的看电影,老板一回来就被抓了,员工希望老板回来时,秘书能通知一下
二。实现
主体接口,被观察者;一般由抽象类或接口实现,它把被观察者保存在一个集合里,可以对观察者增、删、通知变化。
public interface Subject {
void notifyObserver();
void addObserver(Observer o);
void removeObserver(Observer o);
}
观察者接口,得到主体通知时要做的变化。
public interface Observer {
void update();
}
具体主体,根据实际情况加主体属性,比如主体当前状态。它把被观察者保存在一个集合里,可以对观察者增、删、通知变化。
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject{
public List<Observer> observerList = new ArrayList<Observer>();
//具体主体的状态
private String status;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public void notifyObserver() {
observerList.forEach(o->o.update());
}
public void addObserver(Observer o) {
observerList.add(o);
}
public void removeObserver(Observer o) {
observerList.remove(o);
}
public ConcreteSubject(String status) {
super();
this.status = status;
}
}
具体观察者。维护一个具体主体对象的引用,可以得到主体的信息。同时实现update方法.
public class ConcreteObserver implements Observer{
private ConcreteSubject concreteSubject;
private String name;
private String status;
@Override
public void update() {
System.out.println("目前主体的状态是"+concreteSubject.getStatus());
System.out.println(name+"正在"+status);
System.out.println("老板来了");
}
public ConcreteObserver(ConcreteSubject concreteSubject, String name, String status) {
super();
this.concreteSubject = concreteSubject;
this.name = name;
this.status = status;
}
}
客户端
public static void main( String[] args )
{
System.out.println( "Hello World!" );
ConcreteSubject s = new ConcreteSubject("很生气");
s.addObserver(new ConcreteObserver(s, "观察者x", "正在high"));
s.addObserver(new ConcreteObserver(s, "观察者y", "正在打游戏"));
s.notifyObserver();
}
三。使用场景
1.发布订阅,比如微信公众号,发布消息,用户接受到。
2.当一个对象a改变,会影响其他对象bcdef...改变,并且不知道有多少对象会改变,以及每个对象改变情况不同
3.解耦合,定义了主体接口和观察者接口,具体主体和具体观察者解耦,不再是某个主体改变直接调用某个观察者改变方法