B04 观察者模式 示例(一) 基于JDK提供的接口

示例类图

8195388-ece1aa7a3bff9b22.png
观察者模式.png

示例代码

抽象被观察者
  • JDK中提供的用于实现观察者模式的类;
  • 在抽象层组合了多个抽象观察者;
package java.util;

public class Observable {
    private boolean changed = false;
    private Vector<Observer> obs;

    public Observable() {
        obs = new Vector<>();
    }

    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
        if (!obs.contains(o)) {
            obs.addElement(o);
        }
    }

    public synchronized void deleteObserver(Observer o) {
        obs.removeElement(o);
    }

    public void notifyObservers() {
        notifyObservers(null);
    }

    public void notifyObservers(Object arg) {
       
        Object[] arrLocal;

        synchronized (this) {            
            if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);
    }

    public synchronized void deleteObservers() {
        obs.removeAllElements();
    }

    protected synchronized void setChanged() {
        changed = true;
    }

    protected synchronized void clearChanged() {
        changed = false;
    }

    public synchronized boolean hasChanged() {
        return changed;
    }

    public synchronized int countObservers() {
        return obs.size();
    }

}
具体观察者
  • 实现java.util.Observable;
  • setChanged() 用于改变被自身的状态;
  • notifyObservers(question) 通知组合的所有观察者,并将通知信息question广播给所有观察者;
import java.util.Observable;

public class Course extends Observable{

    private String courseName;

    public Course(String courseName) {
        this.courseName = courseName;
    }

    public String getCourseName() {
        return courseName;
    }

    public void produceQuestion(Course course, Question question){
        System.out.println(
                question.getUserName() + "在"
                + course.courseName
                + "提交了一个问题");
        setChanged();
        notifyObservers(question);
        clearChanged();
    }

}
抽象观察者
  • Observable o 为被观察的具体被观察者;
  • Object arg 为具体被观察者广播给所有具体观察者的通知信息;
package java.util;

public interface Observer {
    void update(Observable o, Object arg);
}
具体观察者
  • 所有的具体被观察者的 update(Observable o, Object arg) 方法都会被调用;
import java.util.Observable;
import java.util.Observer;

public class Teacher implements Observer{

    private String teacherName;

    public Teacher(String teacherName) {
        this.teacherName = teacherName;
    }

    @Override
    public void update(Observable o, Object arg) {
        Course course = (Course)o;
        Question question = (Question)arg;
        System.out.println(teacherName + "老师的"
                + course.getCourseName() + "课程接收到一个"
                + question.getUserName() + "提交的问答:"
                + question.getQuestionContent());
    }

}
客户端
  • 被观察者的 course.produceQuestion(course, question); 方法中广播通知了所有的具体观察者;
public class Test {
    public static void main(String[] args) {

        Course course = new Course("Java设计模式精讲");
        Teacher teacher1 = new Teacher("Alpha");
        Teacher teacher2 = new Teacher("Beta");

        course.addObserver(teacher1);
        course.addObserver(teacher2);

        //业务逻辑代码
        Question question = new Question();
        question.setUserName("Geely");
        question.setQuestionContent("Java的主函数如何编写");

        course.produceQuestion(course, question);
    }
}

输出:

Geely在Java设计模式精讲提交了一个问题
Beta老师的Java设计模式精讲课程接收到一个Geely提交的问答:Java的主函数如何编写
Alpha老师的Java设计模式精讲课程接收到一个Geely提交的问答:Java的主函数如何编写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值