观察者模式

 

 

简述:

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

 

观察者模式适用场景

 

当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的,做到(松耦合,高内聚)

 

 

下面通过一个案例:传入一个状态,并执行相关的业务操作

代码实例:

定义一个抽象观察者类

public interface Observer {

    /**
     * 当观察者接收到状态时,执行update方法的业务逻辑
     * @param state
     */
    void update(String state);
}

实现两个具体的观察者

 ObserverA与ObserverB

public class ObserverA implements Observer{

    @Override
    public void update(String state) {
        System.out.println("ObserverA接收到状态:"+state + ",实行相关的业务逻辑");
    }
}
public class ObserverB implements Observer{

    @Override
    public void update(String state) {
        System.out.println("ObserverB接收到状态:"+state+",执行相关的业务逻辑");
    }
}

 

 定义抽象的主题,用于注册所有的观察者

public abstract class Subject {

    /**
     * 观察的集合
     */
    private List<Observer> list = new ArrayList<>();

    /**
     * 添加观察者对象(注册)
     * @param observer
     */
    public void addObserver(Observer observer){
        list.add(observer);
    }

    /**
     * 移除观察者
     * @param observer
     */
    public void removeObserver(Observer observer){
        list.remove(observer);
    }

    /**
     * 通知所有的观察者,
     * 并且观察者会依据这个通知执行自身相关的业务逻辑
     *
     * 其实就是调用所有观察者的具体行为
     * @param state
     */
    protected void notifyObserver(String state){
        for (Observer observer : list) {
            observer.update(state);
        }
    }
}

 

具体的主题,有一个独有的change()方法

public class SubjectA extends Subject{

    /**
     * 主题发生变化时,执行此方法
     */
    public void change(String state){
        notifyObserver(state);
    }
}

 测试(Main)类

public class Main {

    public static void main(String[] args) {
        //创建主题
        SubjectA a = new SubjectA();
        //创建观察者
        Observer o1 = new ObserverA();
        Observer o2 = new ObserverB();
        //注册所有的观察者
        a.addObserver(o1);
        a.addObserver(o2);

        a.change("create");
    }
}

 

posted @ 2018-10-17 17:07  yiwanbin  阅读(218)  评论(0编辑  收藏  举报