观察者模式

观察者模式

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新

1. UML类图

2. 定义

  • Subject被观察者:定义被观察者必须实现的职责,它必须能够动态的增加、取消观察者。他一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者
  • Observer观察者:观察者接收到消息后,即进行update操作, 对接收到的信息进行处理
  • ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义对哪些时间进行通知
  • ConcreteObserve具体的观察者:每个观察在接收到消息后处理反应是不同,各个观察者有自己的处理逻辑

3. 通用代码

//被观察者
public abstract class Subject{
  //定义了一个观察者数组
  private Vector<Observer> obsVector = new Vector<Observer>();
  //增加一个观察者
  public void addObserver(Observer o){
    this.obsVector.add(o);
  }
  //删除一个观察者
  public void delObserver(Observer o){
    this.obsVector.remove(o);
  }
  //通知所有观察者
  public void notifyObservers(){
    for(Observer o : this.obsVector){
      o.update();
    }
  }
}

//具体被观察者
public class ConcreteSubject extends Subject{
  public void doSomething(){
    /*
     * do something
     */
    super.notifyObservers();
  }
}

//观察者
public interface Observer{
  //更新方法
  public void update();
}

//具体观察者
public class ConcreteObserver implements Observer{
  //实现更新方法
  public void update(){
    System.out.println("接收到信息,并进行处理!");
  }
}

//场景类
public class Client{
  public static void main(String[] args){
    //创建一个被观察者
    ConcreteSubject subject = new ConcreteSubject();
    //定义一个观察者
    Observer obs = new ConcreteObserver();
    //观察者观察被观察者
    subject.addObserver(obs);
    //观察者开始活动
    subject.doSomething();
  }
}

4. 应用

4.1 优点

  • 观察者和被观察者之间是抽象耦合:不管是增加观察者还是被观察者都非常容易扩展,而且在Java中都已经实现的抽象层级的定义,在系统扩展方面较为便利
  • 建立一套触发机制

4.2 缺点

观察者模式需要考虑一下开发效率和允许效率,一个被观察者,多个观察者,开发和调试会比较复杂,而且在Java中消息的通知默认是顺序执行,一个观察者卡壳,会影响整体效率,这种情况下一般采用异步的方式

4.3 使用场景

  • 关联行为场景,关联行为是可拆分的而不是组合关系
  • 事件多级触发场景
  • 跨系统的消息交换场景,如消息队列的处理机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值