PerKins Zhu

Le vent se lève,il faut tenter de vivre.

导航

设计模式—观察者模式

Posted on 2016-09-02 15:10  PerKins.Zhu  阅读(176)  评论(0编辑  收藏  举报

观察者模式:如果一个对象(被观察者)状态改变时需要去通知其他对象(观察者)进行一些操作,此时可以使用观察者模式。

      其实质还是通过观察者调用本身的方法进行操作。

示例说明:班长告诉学生老师来了。被观察者:班长,观察者:学生

被观察者:

package com.zpj.designMode.observerPattern;

import java.util.ArrayList;
import java.util.List;

public class Monitor {
    private List<Observer> obers = new ArrayList<Observer>();

    public void notifyStudent() {
        for (Observer ob : obers) {
            ob.teacherIsComming();
        }
    }

    public void addObserver(Observer ob) {
        if (ob != null)
            obers.add(ob);
    }

    public void removeObserver(Observer ob) {
        if (ob != null)
            obers.remove(ob);
    }

}

 

定义观察者接口:

package com.zpj.designMode.observerPattern;

public interface Observer {

    public void teacherIsComming();
}

 

观察者实现类:

package com.zpj.designMode.observerPattern;

public class Student01 implements Observer {

    @Override
    public void teacherIsComming() {
        System.out.println("--------student01  reading");
    }

}


package com.zpj.designMode.observerPattern;

public class Student02 implements Observer {

    @Override
    public void teacherIsComming() {
        System.out.println("--------student01  reading");
    }

}


package com.zpj.designMode.observerPattern;

public class Student03 implements Observer {

    @Override
    public void teacherIsComming() {
        System.out.println("--------student01  reading");
    }

}

 

测试类:

package com.zpj.designMode.observerPattern;

import org.junit.Test;

public class TestUtil {

    @Test
    public void test01() {
        Monitor mo = new Monitor();
        Observer s1 = new Student01();
        Observer s2 = new Student02();
        Observer s3 = new Student03();

        mo.addObserver(s3);
        mo.addObserver(s2);
        mo.addObserver(s1);

        mo.notifyStudent();
    }

    // java 的观察者模式
    @Test
    public void test02() {
        Monitor02 mo02 = new Monitor02();
        java.util.Observer student04 = new Student04();
        mo02.addObserver(student04);
        mo02.teacherIsComming();

    }
}

 

java中是定义的有观察者接口和被观察者抽象类的

package com.zpj.designMode.observerPattern;

import java.util.Observable;

public class Student04 implements java.util.Observer {

    // 实现update抽象方法,在被观察者发生变化之后又在该方法中进行操作
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("------------student04- -----------" + arg);
    }

}

 

 

package com.zpj.designMode.observerPattern;

public class Monitor02 extends java.util.Observable {

    public void teacherIsComming() {
        // 设置changed = true,因为当changed== ture的时候才会调用观察者的update()方法。
        setChanged();
        // 通知观察者被观察者发生改变
        notifyObservers("teacher is comming !!!!");
        ;
    }

}

 

测试方法见test02()。

参考链接:观察者模式

------------------------