定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主体对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式结果图
subject:抽象主题,定义了具体添加、删除观察者接口、通知接口。
concreteSubject:具体主题,具体实现了所有接口,并将所有观察者存放在一个集合中,当主题变化时,通过notify接口通知所有观察者。
observer:观察者接口,定义了更新状态接口
concreteObserver:具体观察者,实现了当主题变化后,具体的操作内容。
优缺点
优点:解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。
缺点:如果一个观察者执行逻辑复杂,则会导致整体比较慢
简单demo
背景
背景为当老板来开会了,员工需要认真记录会议内容,以供自己学习。
解析
老板是实际的主题,会影响员工状态
员工是观察者,当感知到老板来了以后,需要认真记录会议内容
代码实现
主题接口:
public interface Subject { public void addObserver(Observer obj); public void deleteObserver(Observer obj); public void notifyObserver(); }
观察者接口:
public interface Observer { public void update(String info); }
boss具体实现主题:
import java.util.ArrayList; import java.util.List; public class Boss implements Subject { private List<Observer> objList = new ArrayList<Observer>(); @Override public void addObserver(Observer obj) { objList.add(obj); } @Override public void deleteObserver(Observer obj) { objList.remove(obj); } @Override public void notifyObserver() { for(Observer obj : objList) { obj.update("老板来开会"); } } }
员工具体实现观察者:
public class Employee implements Observer { private String name; public Employee(String name) { this.name = name; } @Override public void update(String info) { System.out.println(info + " " + name + "认真记录会议内容。"); } }
客户端验证:
public class TestClient { public static void main(String[] args) { Employee e1 = new Employee("蜗牛"); Employee e2 = new Employee("贝壳"); Subject boss = new Boss(); boss.addObserver(e1); boss.addObserver(e2); boss.notifyObserver(); } }
内容如下:
老板来开会 蜗牛认真记录会议内容。
老板来开会 贝壳认真记录会议内容。