抽象主题(Subject):持有多个观察者对象的引用,抽象主题提供了一个接口可以增加和删除观察者对象;有一个观察者数组,并实现增、删及通知操作具体主题(Concrete Subject):将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知抽象观察者(Observer):定义一个接口,包含更新方法,供具体的观察者实现具体观察者(Concrete Observer):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态保持一致
总之,观察者模式适用于任何需要在对象状态改变时自动通知多个对象,并且这些对象需要及时作出相应更新的情况。这样可以保持对象间的松耦合,提高程序的可维护性和可扩展性。
import java.util.ArrayList;
import java.util.List;
public class Subject {
private List<Observer> observerList = new ArrayList<>();
/**
* 新增观察者
*
* @param observer
*/
public void addObserver(Observer observer) {
this.observerList.add(observer);
}
/**
* 删除观察者
*
* @param observer
*/
public void deleteObserver(Observer observer) {
this.observerList.remove(observer);
}
public void notifyAllObserver() {
for (Observer observer : this.observerList) {
observer.update();
}
}
}
public class BossConcreteSubject extends Subject {
public void doSomething() {
System.out.println("老板完成自己的工作");
//业务操作
System.out.println("视察公司工作情况");
super.notifyAllObserver();
}
}
public interface Observer {
/**
* 观察到消息后进行的操作,就是响应
*/
void update();
}
public class XSConcreteObserver implements Observer {
@Override
public void update() {
System.out.println("小帅发现领导到来,暂停在线摸鱼,回归工作");
}
}
public class XMConcreteObserver implements Observer {
@Override
public void update() {
System.out.println("小美发现领导到来,暂停在线摸鱼,回归工作");
}
}
public class Main {
public static void main(String[] args) {
//创建一个主题,老板
BossConcreteSubject subject = new BossConcreteSubject();
//创建观察者,就是摸鱼的同事
Observer xmObserver = new XMConcreteObserver();
//创建观察者,就是摸鱼的同事
Observer xsObserver = new XSConcreteObserver();
//建立对应的关系,老板这个主题被同事进行观察
subject.addObserver(xsObserver);
subject.addObserver(xmObserver);
//主题开始活动,里面会通知观察者(相当于发布消息)
subject.doSomething();
}
}
