设计模式之观察者模式

来源:互联网 发布:数据堂 山东信息贩卖案 编辑:程序博客网 时间:2024/05/21 23:33

简介

     观察者模式是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

    观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。

观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

模式中的角色

1抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

2具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

3抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

4具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

UML类图


适应场景

    1、当一个对象的数据更新时需要通知其他对象,但又不希望和被通知对象形成紧密的耦合。
    2、当一个对象的数据更新时,这个对象需要让其他对象也更新各自的数据,但这个对象不知道到底有多个对象需要更新数据。

示例代码

主题:Subject类

/**
 * Created by zhu on 4/3/2016.
 */
public interface Subject {
    public void addObserver(Observer o);
    public void deleteObserver(Observer o);
    public void notifyObservere(Observer o);
}

具体主题:SeekJobCenter

/**
 * Created by zhu on 4/3/2016.
 */
public class SeekJobCenter implements Subject {
    ArrayList<Observer> observers;
    String mess;
    boolean changed;


    public SeekJobCenter() {
        observers = new ArrayList<Observer>();
        mess = "";
        changed = false;
    }
    @Override
    public void addObserver(Observer o) {
    if (!observers.contains(o)){
        observers.add(o);
    }
    }
    @Override
    public void deleteObserver(Observer o) {
    if (observers.contains(o)){
        observers.remove(o);
    }
    }

    @Override
    public void notifyObservere(Observer o) {
        if (changed){
            for (int i=0;i<observers.size();i++){
                Observer observer = observers.get(i);
                observer.hearTelephone(mess);
            }
             changed = false;
        }
    }
    public void giveMess(String str){
    if (str.equals(mess)){
        changed = false;


    }
        else {mess = str;
              changed = true;
    }
    }
}

观察者:Observer类

public interface Observer {
    public void hearTelephone(String mess);
}


具体观察者:Student 类
public class Student implements Observer {
    Subject subject;
    File file;
    public Student(Subject subject,String fileName) {
            this.subject = subject;
            file = new File("file");
    }


    @Override
    public void hearTelephone(String mess) {


    }
}

具体观察者:HaiGui

public class HaiGui implements Observer {
    Subject subject;
    File file;
    public HaiGui(Subject subject,String fileName) {
        this.subject = subject;
        file = new File("file");
    }
    @Override
    public void hearTelephone(String mess) {


    }
}


0 0
原创粉丝点击