设计模式之观察者模式

来源:互联网 发布:linux oracle 查看sid 编辑:程序博客网 时间:2024/05/09 04:35

设计模式之观察者模式

观察者模式就是多个观察者对象监视一个主题的对象,当主题对象的内部的状态发生改变时,就通知监视该主题对象的诸多的观察对象,是观察对象的状态也发生相应的改变。

观察者模式的组成:

抽象的观察角色:一般用一个接口或者抽象的类来实现,其中定义了观察者必须实现的方法。

主题角色:维护一个集合,存放所有的观察者对象的引用,可以删除观察者,可以添加观察者,如果一个对象想要成为被观察的对象,只要继承主题角色就可以了。

具体的观察角色:具体的观察角色要实现抽象的观察角色方法,以便当主题对象的内部的状态发生改变的时候,该方法被调用。

观察者模式简单地实现:(java实现):

 

 Watched类:

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**被观察角色即主题角色*/
public class Watched {
    privateList<Watcher> watchers = newLinkedList<Watcher> ();
    privateboolean changed = false;
    publicWatched () {}
    //增加观察者
    publicWatched addWatcher (Watcher watcher) {
        this.watchers.add(watcher);
        returnthis;
    }
    //删除观察者
    publicWatched removeWatcher (Watcher watcher) {
        this.watchers.remove(watcher);
        returnthis;
    }
    //删除所有
    publicvoid removeAllWatchers () {
        this.watchers.clear();
    }
    protectedvoid setChanged () {
        this.changed =true;
    }
    publicboolean hasChanged () {
        returnthis.changed;
    }
    protectedvoid clearChanged () {
        this.changed =false;
    }
    publicint countOfWatchers () {
        returnthis.watchers.size();
    }
    //通知观察者
    publicvoid notifyAllWatchers (Object ob) {
        if(this.changed) {
            Iterator<Watcher> it =this.watchers.iterator();
            while(it.hasNext()) {
            it.next().update(this, ob);
        }
            this.clearChanged();
        }
    }
}

 

Watcher接口:

/**抽象的观察角色*/
public interface Watcher {
    publicvoid update (Watched watched,Object ob);
}

 

Test:测试类:

public class Test {
    publicstatic void main(String[] args) {
        //观察者对象
        Watcher student_1 =new Student ();
        Watcher student_2 =new Student ();
        Watcher student_3 =new Student ();
        //被观察的对象
        Teacher teacher =new Teacher ();
        //添加观察者
        teacher.addWatcher(student_1)
               .addWatcher(student_2)
               .addWatcher(student_3);
        //主题对象内部状态改变
        teacher.setChanged();
        //通知观察者对象
        teacher.notifyAllWatchers("老师来了");
    }
}
  
/**Teacher类继承了Watched,Teacher类的对象就成为一个被观察的对象*/
class Teacher extends Watched {
    publicvoid setChanged () {
        super.setChanged();
    }
}
/**Student是观察者*/
class Student implements Watcher {
    @Override
    publicvoid update(Watched arg0, Object message) {
        if(null != message) {
            System.out.println(message);
        }
    }
}
原创粉丝点击