设计模式之观察者模式

 

 

 

一、观察者模式UML图

设计模式之观察者模式

观察者模式:多个观察者同时监听同一个对象,如果该对象有变化,会通知所有的观察者对象。

例如:天气预报、公司通知放假等等

 

Observer 观察者接口,如果主题发生变更时,则更新状态

ObserverImpl:观察者的实现类,主题发生变化时,更新自己的状态

 

Subject:主题的父类,所有需要观察的主题应该继承这个类

SubjectImp:主题的子类,为对应的具体的主题,

 

 

二、观察者具体代码实现

1、新建观察者接口

public interface Observer {
    /**
     * 更新主题
     * @param subject
     */
    void update(Subject subject);
}

 2、新建主题父类

public class Subject {
    /**
     * 需要观察的对象主题,该对象中要包含所有观察者对象,可以增加或者删除观察者对象
     */
    private List<Observer> observerList = new ArrayList<>();

    /**
     * 添加观察者
     * @param o
     */
    public void addOberver(Observer o){
        observerList.add(o);
    }

    /**
     * 删除观察者
     * @param o
     */
    public void deleteObserver(Observer o){
        observerList.remove(o);
    }

    /**
     * 通知所有观察者
     */
    public void noticeAllObserver(){
        for (Observer each : observerList) {
            each.update(this);
        }
    }
}

3、新建观察者实现类

public class ObserverImpl implements Observer {
    private int status;
    /**
     * 通知具体的观察者更新主题对象
     * @param subject
     */
    @Override
    public void update(Subject subject) {
        this.status = ((SubjectImp)subject).getStatus();
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}

4、新建主题的子类

public class SubjectImp extends Subject {
    private int status;

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
        /**
         * 通知所有的观察者
         */
        this.noticeAllObserver();
    }
}

5、测试

public class TestMain {
    public static void main(String[] args) {
        Subject subject = new SubjectImp();

        ObserverImpl o1 = new ObserverImpl();
        ObserverImpl o2 = new ObserverImpl();
        ObserverImpl o3 = new ObserverImpl();

        o1.setStatus(1);
        o2.setStatus(2);
        o3.setStatus(3);

        subject.addOberver(o1);
        subject.addOberver(o2);
        subject.addOberver(o3);
        System.out.println("打印修改之前的状态");
        System.out.println(o1.getStatus());
        System.out.println(o2.getStatus());
        System.out.println(o3.getStatus());

        ((SubjectImp) subject).setStatus(10);
        System.out.println("打印修改之后的状态");
        System.out.println(o1.getStatus());
        System.out.println(o2.getStatus());
        System.out.println(o3.getStatus());
    }

}

打印结果如下:

打印修改之前的状态
1
2
3
打印修改之后的状态
10
10
10