主要作用:

当对象间存在一对多的关系时,当一个对象状态变化时,通知依赖它的对象

一、本质理解


 

 

说明:

所谓观察者模式是一个类的状态的变化,可以被其他类检测到,并作出相应的变化

类图如下:

 

 

类说明:定义一个抽象的方法,用于对被观察者的类的状态作出反应

public abstract class Observer {
    protected Subject subject;
    public abstract void update();
} 

定义具体的类,实现抽象方法,并在构造方法中加到被通知的集合中

public class BinaryObserver extends Observer{

    public BinaryObserver(Subject subject){
        this.subject=subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println( "Binary String: "
            + Integer.toBinaryString( subject.getState() ) );
    }
}
public class OctalObserver extends Observer {

    public OctalObserver (Subject subject){
        this.subject=subject;
        this.subject.attach(this);
    }
    @Override
    public void update() {
        System.out.println( "Octal String: "
            + Integer.toOctalString( subject.getState() ) );
    }
}

定义观察者类,有以下属性,定义一个集合用于存放所有的观察者

定义一个状态用于通知所有的观察者,被观察者的状态

当被观察者的状态变化时,进行通知被观察者

public class Subject {
    private List<Observer> observers = new ArrayList<Observer>();;
    private int state;

    public int getState() {
        return state;
    }

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

    public void attach(Observer observer){
        this.observers.add(observer);
    }

    public void notifyAllObservers(){
        for (Observer observer : observers) {
            observer.update();
        }
    }

}

示例:

public class ObserverPatternDemo {
    public static void main(String[] args) {
        Subject subject = new Subject();
        new OctalObserver(subject);
        new BinaryObserver(subject);

        subject.setState(1);
    }
} 

输出结果:

Octal String: 1
Binary String: 1 

所有的观察者收到被观察者的变化

 

posted on 2021-09-27 11:51  安晏朋  阅读(37)  评论(0编辑  收藏  举报