概念:
观察者模式:Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notifued and updated automatically. 定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,其他所有依赖它的对象都会得通知并被自动更新。
实现:
定义观察者接口
public interface Observer { void clicked(Clieckable clieckable); }
定义被观察者接口
public interface Clieckable { void click(); void addObserver(Observer observer); void delObserver(Observer observer); }
观察者具体实现
public class ButtonObserver implements Observer { @Override public void clicked(Clieckable clieckable) { System.out.println("作为一个观察者,我当然看到按钮被点了。"); } }
被观察者具体实现
public class Button implements Clieckable { List<Observer> list = new ArrayList<>(); @Override public void click() { System.out.println("按钮被点击了"); list.forEach(item->{ item.clicked(this); }); } @Override public void addObserver(Observer observer) { list.add(observer); } @Override public void delObserver(Observer observer) { list.remove(observer); } }
测试及结果:
@Test public void observerTest(){ Button button = new Button(); button.addObserver(new ButtonObserver()); button.click(); }
按钮被点击了
作为一个观察者,我当然看到按钮被点了。
分析:
1.在抽象出接口或者抽象类后扩展都变得非常方便。
2.广播式通信,被观察者可以添加多个观察者对象,在相同的观察主题下,支持一对多的通知模式。
3.在单线程下,如果有多个观察者,可能对于通知观察者需要的时间更长一下,在for循环中处于串联式通知;必要的时候可以考虑多线程异步通知。
4.观察者模式属于处于单项通知,有些类似于偷拍的感觉,观察者可以实时知道被观察者的状态,但是被观察者并不能得知自己处于一个被观察的状态。
5.适用场景:
a.一组被同意事物控制的行为。比如跑步的信号枪。
b.事件多级出发。比如公司的款项报销审批流程。c.跨系统的消息队列处理。
...