简易的设计模式——观察者模式

观察者模式(Observer Pattern)也叫做发布订阅模式。

定义

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

几种角色

在观察者模式中有这么几种角色:

  1. Subject被观察者:定义被观察者必须能动态地增加和删除观察者,一般为抽象类。
  2. Observer观察者:观察者接受到消息之后,能对接受到得消息进行处理。
  3. ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义哪些事件需要进行通知。
  4. ConcreteObserver具体的观察者:在接收到消息之后,对消息进行不同的处理。

代码实现

观察者 Observer.java

public interface Observer {
    public void update();
}

具体的观察者 ConcreteObserver.java

public class ConcreteObserver implements Observer {
    @Override
    public void update() {
        System.out.println("接收到消息,并进行处理!");
    }
}

被观察者 Subject.java

import java.util.Vector;

public abstract class Subject {

    //也可以使用ArrayList,ArrayList是线程异步的,不安全。
    private Vector<Observer> obsVector = new Vector<Observer>();

    public void addObserver(Observer observer){
        this.obsVector.add(observer);
    }

    public void delObserver(Observer observer){
        this.obsVector.remove(observer);
    }

    public void notifyObservers(){
        for (Observer observer: this.obsVector ){
            observer.update();
        }
    }

}

具体的被观察者 ConcreteSubject.java

public class ConcreteSubject extends Subject {
    public void doSomething(){
        //do something
        super.notifyObservers();
    }
}

场景类 Client.java

public class Client {
    public static void main(String args[]){

        ConcreteSubject subject = new ConcreteSubject();
        ConcreteObserver observer = new ConcreteObserver();

        subject.addObserver(observer);
        subject.doSomething();
    }
}

观察者模式的优点

  • 观察者和被观察者之间是抽象耦合

    即使不断增加观察者还是被观察者非常容易扩展

  • 建立一套触发机制

    根据单一职责原则,每个类的职责是单一的,通过一个触发机制,形成触发链。观察者就可以实现这种链式结构。

观察者模式的缺点

  • 观察者模式需要考虑一下开发效率和运行效率,当形成多级触发的时候,效率会令人担忧。消息的通知可以采用异步的方式进行。
posted @ 2015-04-13 19:09  whthomas  阅读(213)  评论(1编辑  收藏  举报