美文网首页
设计模式之观察者模式

设计模式之观察者模式

作者: 老羊_肖恩 | 来源:发表于2017-06-13 15:40 被阅读9次

观察者模式定义

观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/Subscribe), 它是一个在项目中经常使用的设计模式,其定义如下:
  Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 即:定义对象间一种一对多的依赖关系,使得每当一个对象状态改变时,则依赖于它的所有对象都会得到通知并被更新。
观察者模式的通用类图如下所示:


Observer.jpg

接下来解释观察者模式的几个角色:

  • Subject 抽象被观察者。定义被观察者必须实现的功能,它必须能动态地增加、取消观察者。职责为:管理观察者并通知观察者。
  • ConcreteSubject 具体的被观察者。定义自己的业务逻辑,同时定义对哪些时间进行通知。
  • Observer 抽象观察者。观察者接收到消息后,即进行相关操作,对接收到的信息进行处理。
  • ConcreteObserver 具体的观察者。每个观察者接收到消息后的处理反应 不一样,各个观察者有自己的处理逻辑。
    观察者模式的通用代码如下:
import java.util.ArrayList;

//抽象的被观察对象
public abstract class Subject{
    //定义一个观察者数组
    private ArrayList<Observer> obses = new ArrayList<Observer>();
    //增加观察者
    public void addObserver(Observer observer){
        this.obses.add(observer);
    }
    //移除一个观察者
    public void removeObserver(Observer observer){
        this.obses.remove(observer);
    }
    //通知所有的观察者
    protected void notifyObservers(){
        this.obses.forEach(ob->{
            ob.update();
        });
    }
    
    //被观察者业务逻辑
    public abstract void doSomething();
}

//具体的被观察者
public class ConcreteSubject extends Subject{

    @Override
    public void doSomething() {
        System.out.println("ConcreteSubject doSomething...");
        super.notifyObservers();
    }
    
}

//抽象的观察者
public abstract class Observer{
    protected String name;
    //业务逻辑
    public abstract void update();
}

//具体的观察者
public class ConcreteObserver extends Observer{

    @Override
    public void update() {
        System.out.println(this.name + " received message and update...");
    }
    
    public ConcreteObserver(String name){
        this.name = name;
    }
}

//客户端
public class ObserverClient{
    public static void main(String[] args) {
        //创建被观察者
        Subject subject = new ConcreteSubject();
        //定义被观察者
        Observer observer1 = new ConcreteObserver("observer1");
        Observer observer2 = new ConcreteObserver("observer2");
        
        subject.addObserver(observer1);
        subject.addObserver(observer2);
        
        subject.doSomething();
    }
}

通用代码的运行结果如下:

ConcreteSubject doSomething...
observer1 received message and update...
observer2 received message and update...

观察者模式的应用

观察者模式的优点

  • 观察者和被观察者之间是抽象耦合的。使得不管是增加观察者还是被观察者都十分容易,系统扩展方面非常简单。
  • 建立一套出发机制。根据单一职责原则,每个类的职责都是单一的,观察者模式可以完美地实现触发链机制。

观察者模式的缺点

观察者模式需要考虑开发效率和运行效率。一般可以采用异步的方式。且多级触发的效率更差,设计是注意考虑。

观察者模式的使用场景

  • 关联行为场景。
  • 事件(多级)触发场景。
  • 跨系统的消息交换场景。如消息队列的处理机制。

观察者模式的注意事项

  • 广播链问题。
  • 异步处理问题。

《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。

相关文章

网友评论

      本文标题:设计模式之观察者模式

      本文链接:https://www.haomeiwen.com/subject/vqhafxtx.html