设计模式--观察者模式[10]

核心作用

观察者模式主要用于1:N的通知。当一个对象的状态变化时,他需要及时告知一些列对象,另他们做出相应。通知观察者的方式有推、拉。

使用场景

  • 资讯订阅等功能

观察者代码

观察者模式


/**
 * 观察者
 *
 * @author mac
 * @date 2019-05-26 17:54
 */
public interface ObServer {
    void update(Subject subject);
}

/**
 * 主题对象
 *
 * @author mac
 * @date 2019-05-26 17:55
 */
public class Subject {
    private List<ObServer> list = new ArrayList<>();

    public void registerObServer(ObServer obs){
        list.add(obs);
    }

    public void removeObServer(ObServer obs){
        list.remove(obs);
    }

    /**
     * 通知所有观察者更新状态
     */
    public void notifyAllObServer(){
        for(ObServer obs:list){
            obs.update(this);
        }
    }
}

/**
 * Discripition
 *
 * @author mac
 * @date 2019-05-26 18:00
 */
public class ConcreteSubject extends Subject {
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        //状态发生变化,通知所有的观察者
        this.notifyAllObServer();
    }
}

/**
 * Discripition
 *
 * @author mac
 * @date 2019-05-26 18:02
 */
public class ObServerA implements ObServer{
    //该状态和subject对象中的状态值保持一致
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    @Override
    public void update(Subject subject) {
        state = ((ConcreteSubject)subject).getState();
    }
}

public class ObServerTest {
    public static void main(String[] args) {
        //创建目标对象
        ConcreteSubject cs = new ConcreteSubject();

        //创建观察者
        ObServerA ob1 = new ObServerA();
        ObServerA ob2 = new ObServerA();
        ObServerA ob3 = new ObServerA();

        //把观察者加入到目标观察者列表中
        cs.registerObServer(ob1);
        cs.registerObServer(ob2);
        cs.registerObServer(ob3);

        //改变subject的状态
        cs.setState(100);
        //观察 观察者中的状态变化
        System.out.println(ob1.getState());
        System.out.println(ob2.getState());
        System.out.println(ob3.getState());

        //改变subject的状态
        cs.setState(300);
        //观察 观察者中的状态变化
        System.out.println(ob1.getState());
        System.out.println(ob2.getState());
        System.out.println(ob3.getState());
    }
}


观察者JDK代码

观察者模式


import java.util.Observable;

/**
 * 目标对象
 *
 * @author mac
 * @date 2019-05-26 19:30
 */
public class ConcreteSubject extends Observable {
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        setChanged();
        notifyObservers(state);
    }
}

/**
 * Discripition
 *
 * @author mac
 * @date 2019-05-26 19:35
 */
public class ObServerA implements Observer {
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    @Override
    public void update(Observable o, Object arg) {
        state = ((ConcreteSubject)o).getState();
    }
}

public class ObServerTest {
    public static void main(String[] args) {
        //创建目标对象
        ConcreteSubject cs = new ConcreteSubject();

        //创建观察者
        ObServerA ob1 = new ObServerA();
        ObServerA ob2 = new ObServerA();
        ObServerA ob3 = new ObServerA();

        //把观察者加入到目标观察者列表中
        cs.addObserver(ob1);
        cs.addObserver(ob2);
        cs.addObserver(ob3);

        //改变subject的状态
        cs.setState(100);
        //观察 观察者中的状态变化
        System.out.println(ob1.getState());
        System.out.println(ob2.getState());
        System.out.println(ob3.getState());

        //改变subject的状态
        cs.setState(300);
        //观察 观察者中的状态变化
        System.out.println(ob1.getState());
        System.out.println(ob2.getState());
        System.out.println(ob3.getState());
    }
}

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦