类结构图

图片说明

UML图

图片说明

初步理解

当使用观察者模式时,当一个状态发生变化,那么观察者会一一通知加入到观察者集合中的类。

代码理解

底部抽象类

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

观察者类

int为变化的状态,list装需要观察int状态的对象。

public class Subject {

    private List<Observer> list = 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){
        list.add(observer);
    }

    public void notifyAllObservers(){
        for (int i=0;i<list.size();i++) {
            list.get(i).update();
        }
    }
}

抽象类的实现类(3个)

public class Timi extends Observer {
    public Timi(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update() {
        System.out.println( "Timi收到了消息并更新了版本 " + 3+subject.getState() );
    }
}

public class LOL extends Observer{

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

    @Override
    public void update() {
        System.out.println( "LOL收到了消息并更新版本 " + subject.getState() );
    }
}

public class Steam extends Observer{

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

    @Override
    public void update() {
        System.out.println( "Steam收到了通知并更新了版本 "+ (subject.getState()+3) );
    }
}

测试类

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

        new LOL(subject);
        new Timi(subject);
        new Steam(subject);

        System.out.println("发送第一个消息");
        subject.setState(4);
        System.out.println("发送第二个消息");
        subject.setState(5);
    }
}

测试结果

发送第一个消息
LOL收到了消息并更新版本 4
Timi收到了消息并更新了版本 34
Steam收到了通知并更新了版本 7
发送第二个消息
LOL收到了消息并更新版本 5
Timi收到了消息并更新了版本 35
Steam收到了通知并更新了版本 8

总结

观察者进行通知行为,是因为其内部有一个List,需要通知的对象,必须添加到这个list中。然后发通知后,对list进行遍历。