Java设计模式之观察者模式

观察者模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。

 

  • Subject(被观察者) 被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
  • ConcreteSubject 被观察者的具体实现。包含一些基本的属性状态及其他操作。
  • Observer(观察者) 接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
  • ConcreteObserver 观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

 

下面我们来实现一个简单的观察者模式

 

观察者 

/*
* 定义观察者对象
* */
class MyListener{

/*
* 观察者对象有一个被观察者对象的引用(Observable)
* 通过这个引用来知晓是那个对象发生了改变
* */
    protected MyObservable observable;
/*
* 定义一个布尔类型的信号
* 这个信号用来告知迭代观察者对象的程序应该由哪些观察者做出响应。
* */
    protected boolean flag = false;

/*
* 定义一个观察者对象做出响应的方法。
* */
    public void changeObject(){
        System.out.println(observable+"已经讲完了课!");
   }
}

 

被观察者

/*
* 实现被观察者的对象MyObervable
* */
class MyObservable{
/*
* 定义一个静态的ArrayList(lists)
* 用于存储所有被添加的观察者引用。
* */
private static List<MyListener> lists = new ArrayList<>();

/*
* 定义一个非静态的ArrayList(listlistener)
* 这是因为一个对象可以添加多个观察者,
* 而当对象发生变化时需要通知此对象的观察者,
* 所以每个对象的观察者需要另外进行存储。
* */
    private List<MyListener> listlistener = new ArrayList<>();

/*
* 注册观察者对象方法
* */
    public void addMyListener(MyListener listener){
        listener.observable = this;
        listlistener.add(listener);
        lists.add(listener);
    }

/*
* 注销观察者对象方法
* */
    public void removeMyListener(MyListener listener){
        listener.observable = null;
        listlistener.remove(listener);
        lists.remove(listener);
    }

/*
* 改变观察者的flag信号为true
* */
    public void changeflag(){
        for (MyListener listener:listlistener
             ) {
            listener.flag = true;
        }
    }

/*
* 观察者迭代器
* 对信号flag为true的观察者允许其做出响应
* 并重置信号flag
* */
    public static void notifyObser(){
        for (MyListener listener:lists
             ) {
            if(listener.flag==true){
                listener.changeObject();
                listener.flag = false;
            }
        }
    }
}

 

观察者具体

/*
* 定义具体观察者对象
* */
class Student extends MyListener{}

 

被观察者具体

/*
 * 定义具体被观察者对象
 * */
class Teacher extends MyObservable{

    /*
     * 定义一个需要观察者对象观察的逻辑方法
     * 在该方法中改变观察者的信号标志
     * 并调用静态方法notifyObser()通知迭代器进行观察者迭代
     * */
    public void teachingComplete(){
        System.out.println("我已经讲完了");
        changeflag();
        MyObservable.notifyObser();
    }
}

 

测试代码

Teacher t1 = new Teacher();
Student s1 = new Student();
Student s2 = new Student();
t1.addMyListener(s1);
t1.addMyListener(s2);
t1.teachingComplete();
System.out.println("-------------");
t1.removeMyListener(s1);
t1.teachingComplete();

/*
* Output:
我已经讲完了
MyProject.CSDN.Teacher@57829d67已经讲完了课!
MyProject.CSDN.Teacher@57829d67已经讲完了课!
-------------
我已经讲完了
MyProject.CSDN.Teacher@57829d67已经讲完了课!
* */

 

posted @ 2018-12-24 11:19  问月晚安  阅读(211)  评论(0编辑  收藏  举报