Java设计模式

观察者模式:observer

2018-10-22  本文已影响13人  lconcise

观察者模式中有主题(Subject)和观察者(Observer),它定义了对象之间的一对多的依赖关系,当主题状态发生变化时,所有观察者都会收到通知并且自动更新。
简单来说,它类似于邮件订阅,当我们订阅了该文章,如果后续有更新,会及时通知你。

捕获.PNG

示例代码:

/**
 * 观察者.
 */
public interface Observer {
    void update();
}
/**
 * 观察者实现类 Observer01.
 */
public class Observer01 implements Observer{
    @Override
    public void update() {
        System.out.println("Observer01 has received");
    }
}
/**
 * 观察者实现类 Observer02.
 */
public class Observer02 implements Observer{
    @Override
    public void update() {
        System.out.print("Observer02 has received");
    }
}
/**
 * 主题(被观察者).
 */
public interface Subject {
    /**
     * 增加观察者.
     *
     * @param observer 观察者.
     */
    void add(Observer observer);

    /**
     * 删除观察者.
     *
     * @param observer 观察者
     */
    void delete(Observer observer);

    /**
     * 通知所有观察者.
     */
    void notifyToAll();

    /**
     * 自身的操作.
     */
    void operation();
}
/**
 * 主题(被观察者).
 */
public abstract class AbstractSubject implements Subject {
    /**
     * 存储观察者.
     */
    private Vector<Observer> vector = new Vector();

    @Override
    public void add(Observer observer) {
        vector.add(observer);
    }

    @Override
    public void delete(Observer observer) {
        vector.remove(observer);
    }

    @Override
    public void notifyToAll() {
        Enumeration<Observer> enumeration = vector.elements();
        while (enumeration.hasMoreElements()) {
            enumeration.nextElement().update();
        }
    }
}
/**
 * 主题(被观察者)实现类.
 */
public class MySubject extends AbstractSubject {
    @Override
    public void operation() {
        System.out.println("subject do operation ");
        // 通知所有观察者
        notifyToAll();
    }
}

测试:

public class ObserverTests {

    public static void main(String[] args) {
        // 创建 主题(被观察者)
        Subject mySubject =new MySubject();

        // 创建观察者
        Observer observer01 = new Observer01();
        Observer observer02 = new Observer02();

        // 主题(被观察者) 与 观察者确立关系 (一对多)
        mySubject.add(observer01);
        mySubject.add(observer02);
        
        mySubject.operation();
    }
}

测试结果:


image.png
上一篇 下一篇

猜你喜欢

热点阅读