观察者模式:如果一个对象(被观察者)状态改变时需要去通知其他对象(观察者)进行一些操作,此时可以使用观察者模式。
其实质还是通过观察者调用本身的方法进行操作。
示例说明:班长告诉学生老师来了。被观察者:班长,观察者:学生
被观察者:
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()。
参考链接:观察者模式
------------------------