设计模式(三)观察者模式-装饰对象

2019-06-23  本文已影响0人  天色将变
定义

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

解决的问题

对象A(主题)有数据,对象BCD依赖于A的数据,当A的数据有状态变化时,BCD需要及时知道。

使用到的原则
类图
image.png
描述
伪代码

主题接口

public interface Subject{
  public void registerObserver(Observer o);
  public void removeObserver(Observer o);
  public void notifyChanges();
}

观察者接口

public interface Obsever{
  public void update();
}

主题的具体实现

public class SomeSubject implements Subject{
  private ArrayList observers;
  public SomeSubject(){
    observers = new ArrayList();
  }
  public void registerObserver(Observer o){
    observers.add(o);
  }
  public void removeObserver(Observer o){
    int i = observers.indexOf(o);
    if(i>=0){
      observers.remove(i);
    }
  }
  public void notifyChanges(){
    for(int i=0;i<observers.length();i++){
      Observer o = observers[i];
      o.update();
    }
  }
  public StatusMsg getStatusMsg(){
    return msg;
  }
  public void statusChange(){
    notifyChanges();
  }
}

观察者的一个具体实现

public class ObserverSubclass1 implements Observer{
  private Subject subject;
  public ObserverSubclass1(Subject s){
    this.subject = s;
    s.registObserver(this);// 将观察者添加进观察者列表
  }
  public void update(){
    toDo();
  }
  public void toDo(){
    SomeSubject  ss = (SomeSubject)subject;
    StatusMsg sm = ss.getStatusMsg();// 获取状态变化信息
    System.out.println(sm.toString());
  }
}

示例

SomeSubject ss = new SomeSubject();//定义主题
ObserverSubclass1 os1 = new ObserverSubclass1(ss);//创建观察者1,并注册
ObserverSubclass2 os2 = new ObserverSubclass2(ss);//创建观察者2,并注册
ss.statusChange();// 主题状态变化,通知到os1 os2
ss.statusChange();// 主题状态再次变化,通知到os1 os2
一句话总结

我订阅了你,你变化了,你要告诉我。

上一篇 下一篇

猜你喜欢

热点阅读