在学Dubbo之前,还得先学一下观察者模式

  1. Subject:抽象被观察者(目标):
  2. 一个目标可以被多个观察者观察。目标变化时,目标会通知所有登记的观察者拥有一个抽象观察者的引用
  3. Observer:抽象观察者:
  4. 得到目标的通知时更新自己。更新方法:Updata();
  5. Concrete Subject:具体被观察者
  6. 将状态存入具体现察者对象。自己变化时,给所有登记的观察者发出通知
  7. Concrete Observer:具体观察者
  8. 拥有一个指向具体目标的引用

1.1别名

发布-订阅(Publish/Subscribe)模式
模型-视图(Model/View)模式
源-监听器(Source/Listener)模式
从属者(Dependents)模式。

1.2注意

  • 是一对多的单向依赖:多个观察者对象同时观察一个目标对象, 观察者依赖于目标。
  • 相互观察时注意死循环
    • 若 A、B观察C,B、C观察A,则需要两套观察模式,否则死循环
  • 通知的顺序:同时

    • 多个观察者是平行的(虽然是循环,但几乎同时完成)

      1.3优缺点

      1.3.1优点

  • 实现了观察者和被观察者之间的抽象耦合。

  • 动态联动
  • 广播通信。被观察者会向所有的登记的观察者发出通知。

    1.3.2缺点

    可能会引起无谓的操作。
    由于采用广播方式,不管观察者需不需要,每个观察者都会被调用update方法

    1.4一个接口一个父类

    1.4.1 Observer接口

    Observer为java.util包下的一个接口,源码如下:
  1. public interface Observer {
  2. void update(Observable o, Object arg);
  3. }

该接口约定了观察者的行为

当前接口代表观察者,要与被观察对象交互,需要持有被观察对象Observable的引用,因此update方法一个参数的类型是Observable
与调用者通信,则是使用Object类型的参数。该参数是调用者调用Observable实例的notifyObservers(Object obj)方法时传入的,也可以不传。

1.4.2 Observable类

java.util.Observable
该类实现了被观察者的功能
该类的成员变量和方法如下:

  1. public class Observable {
  2. private boolean changed = false;
  3. private Vector<Observer> obs;
  4. public Observable(){};
  5. protected synchronized void setChanged(){};
  6. protected synchronized void clearChanged(){};
  7. public synchronized void addObserver(Observer o){};
  8. public synchronized void deleteObserver(Observer o) {};
  9. public synchronized void deleteObservers(){};
  10. public synchronized boolean hasChanged(){};
  11. public synchronized int countObservers(){};
  12. public void notifyObservers(){};
  13. public void notifyObservers(Object arg){};
  14. }

1.5一个观察者模式的实例《办公室摸鱼记》

要求:
办公时间摸鱼, 在老板到来时,前台负责通知同事进入工作状态

  • 观察者:两个同事,需要实现Observer接口
  • 被观察者有两个:前台和老板,应该继承Observeable类
    • 前台通知:摸鱼的人改为工作状态
    • 老板通知:摸鱼的人被老板发现并且批评

      1.5.1 第一步:观察者继承父类

      ```java import java.util.Observable; import java.util.Observer;

@Data @Allargsconstructor public abstract class Observers implements Observer{

  1. protected String name;
  2. @Override
  3. public abstract void update(Observable o, Object arg);
  4. public abstract void see();
  5. public abstract void exit();
  6. public abstract void criticize();
  1. <a name="H7UJ3"></a>
  2. ## 1.5.2 第二步:两个被观察者实现接口
  3. ```java
  4. import java.util.Observable;
  5. public class Boss extends Observable {
  6. private int state=0;//离开
  7. public void com() {
  8. System.out.println("我大老板回来了");
  9. state=2;//回来
  10. setChanged();//必须要写
  11. notifyObservers(state);//发出通知
  12. }
  13. }
  1. import java.util.Observable;
  2. public class Secretary extends Observable{
  3. private int state=0;//老板离开
  4. public void see() {
  5. System.out.println("老板回来了");
  6. state=1;//老板回来啦
  7. setChanged();
  8. notifyObservers(state);
  9. }
  10. }

1.5.3 第三步:写两个具体子类继承观察者父类

  1. import java.util.Observable;
  2. import java.util.Observer;
  3. public class NBAObserver extends Observers{
  4. public NBAObserver(String name) {
  5. super(name);
  6. // TODO Auto-generated constructor stub
  7. }
  8. @Override
  9. public void update(Observable o, Object arg) {
  10. // TODO Auto-generated method stub
  11. Integer state=(Integer)arg;
  12. switch(state){
  13. case 0:
  14. see();break;
  15. case 1:
  16. exit();break;
  17. case 2:
  18. criticize();break;//老板通知
  19. }
  20. }
  21. @Override
  22. public void see() {
  23. // TODO Auto-generated method stub
  24. System.out.println(name+"看NBA");
  25. }
  26. @Override
  27. public void exit() {
  28. // TODO Auto-generated method stub
  29. System.out.println(name+"停止看NBA,开始工作");
  30. }
  31. @Override
  32. public void criticize() {
  33. // TODO Auto-generated method stub
  34. System.out.println(name+"你居然在工作时间看NBA,快工作!");
  35. }
  36. }
  1. import java.util.Observable;
  2. public class StockObserver extends Observers{
  3. public StockObserver(String name) {
  4. super(name);
  5. // TODO Auto-generated constructor stub
  6. }
  7. @Override
  8. public void see() {
  9. // TODO Auto-generated method stub
  10. System.out.println(name+"看股票");
  11. }
  12. @Override
  13. public void exit() {
  14. // TODO Auto-generated method stub
  15. System.out.println(name+"停止看股票,开始工作");
  16. }
  17. @Override
  18. public void criticize() {
  19. // TODO Auto-generated method stub
  20. System.out.println(name+"你居然在工作时间看股票,快工作!");
  21. }
  22. @Override
  23. public void update(Observable o, Object arg) {
  24. // TODO Auto-generated method stub
  25. Integer state=(Integer)arg;
  26. switch(state){
  27. case 0:
  28. see();break;
  29. case 1:
  30. exit();break;//秘书通知
  31. case 2:
  32. criticize();break;//老板通知
  33. }
  34. }
  35. }

1.5.4 第四步:main方法整合

  1. public class Test {
  2. public static void main(String[] args) {
  3. NBAObserver nba=new NBAObserver("张三");
  4. StockObserver stock=new StockObserver("李四");
  5. Secretary s=new Secretary();
  6. s.addObserver(nba);
  7. s.addObserver(stock);
  8. s.see();
  9. Boss b=new Boss();
  10. b.addObserver(nba);
  11. b.addObserver(stock);
  12. b.com();
  13. }
  14. }