java设计模式之观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。

观察者模式通常由4部分组成,抽象的被观察者、具体的被观察者、抽象的观察者、具体的观察者。

代码示例

1、抽象的观察者

public interface Watcher {

    void update();
}

2、抽象的被观察者

public interface Subject {

    /**
     * 添加观察者
     * @param watcher
     */
    void addWatcher(Watcher watcher);

    /**
     * 删除观察者
     * @param watcher
     */
    void deleteWatcher(Watcher watcher);

    /**
     * 被观察者行为
     */
    void service();

}

这里方法service定义了被观察者的某种行为,当这种行为发生某种变化时将通知所有观察者。

3、具体的被观察者

public class ConcreteSubject implements Subject {

    private List<Watcher> watchers = new ArrayList<>();

    private Integer value = 0;

    @Override
    public void addWatcher(Watcher watcher) {
        watchers.add(watcher);
    }

    @Override
    public void deleteWatcher(Watcher watcher) {
        watchers.remove(watcher);
    }

    @Override
    public void service() {
        System.out.println("被观察者做了一些事情,更新标识并通知所有观察者");
        setValue(1);
        notifyAllWatcher();
    }

    private void notifyAllWatcher() {
        if(getValue().equals(1))
        {
            for(Watcher watcher : watchers)
            {
                watcher.update();
            }
        }

    }

    public Integer getValue() {
        return value;
    }

    public void setValue(Integer value) {
        this.value = value;
    }
}

4、具体的观察者

public class FirstWatched implements Watcher {
    @Override
    public void update() {
        System.out.println("first watched updated...");
    }
}
public class SecondWatched implements Watcher {
    @Override
    public void update() {
        System.out.println("second watched updated...");
    }
}

5、测试代码

public class Main {

    public static void main(String[] args) {
        Watcher firstWatched = new FirstWatched();
        Watcher secondWatched = new SecondWatched();
        Subject subject = new ConcreteSubject();

        subject.addWatcher(firstWatched);
        subject.addWatcher(secondWatched);
        subject.service();
    }
}

6、输出

被观察者做了一些事情,更新标识并通知所有观察者
first watched updated...
second watched updated...
原文地址:https://www.cnblogs.com/xiaosiyuan/p/6485041.html