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

定义

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

解决的问题

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

使用到的原则
  • 松耦合,当两个对象之间松耦合,它们依然可以交互,但是不太清楚彼此的细节。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
类图
image.png
描述
  • 定义主题接口Subject,三个方法,注册、删除和通知状态更新观察者。
  • 定义观察者接口Observer,一个方法,update,表示接受主题状态更新。
  • SomeSubject是Subject的具体实现,实现了三个接口方法。
  • ObserverSubclass1和ObserverSubclass2都实现了Observer接口,是两个观察者。二者都保留了Subject的引用,用于获取状态更新getStatusMsg()。
伪代码

主题接口

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
一句话总结

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容