设计模式之观察者模式

作者: GitCode8 | 来源:发表于2019-02-25 09:46 被阅读7次

观察者模式适合在一对多的关系,但被观察者状态或行为的改变需要通知观察者的情况。在平常开发中,观察者 模式是经常使用到的,像Android中的BroadCast,Listener,第三方框架的Rxjava,EventBus。观察者模式相对于其它设计模式来说,比较易懂和易学。属于行为型模式。
下面以例子,讲解设计模式的实际应用和一些概念。
南方日报公司明天都会印发报纸,向订阅报纸的读者送报纸。这里的南方日报公司就是观察者模式中的被观察者,读者就是观察者,两者之间的关系,就是订阅。而公司只有一个,读者可能有0个或者多个,所以是一对多的关系。

  1. 首先我们定义南方日报公司实体类。也即是观察者模式中的被观察对象,通过List持有订阅对象,在相关数据发生改变的时候,通知观察者。
public class PaperCompany {

    private List<Observer> readers = new LinkedList();

    public boolean subscribe(Observer reader) {
        if (reader != null) {
            return readers.add(reader);
        }

        return false;
    }

    public boolean unSubscribe(Observer reader) {
        if (reader != null) {
            return readers.remove(reader);
        }
        return false;
    }

    public void notifyPostPaper(String todayPaper) {
        for (Observer reader : readers) {
            reader.postPaper(todayPaper);
        }
    }

}
  1. 定义观察者的父类接口,再定义两位读者实现该接口,使其观察南方日报报纸。
public interface Observer {
    /**
     * 送报纸
     * @param name 报纸名
     */
    void postPaper(String name);
}
public class Reader1 implements Observer {
    @Override
    public void postPaper(String name) {
        System.out.println("我是读者1,收到南方日报报纸:"+name);
    }
}
public class Reader2 implements Observer {
    @Override
    public void postPaper(String name) {
        System.out.println("我是读者2,收到南方报纸:"+name);
    }
}

  1. 当观察者和被观察对象建立订阅关系后,被观察对象在适当时机调用相关方法通知观察者。例如数据发生变化、网络变化等。
public class Main {
    public static void main(String[] args) {
        PaperCompany paperCompany=new PaperCompany();

        Observer reader1=new Reader1();

        Observer reader2=new Reader2();

        paperCompany.subscribe(reader1);

        paperCompany.subscribe(reader2);

        paperCompany.notifyPostPaper("今日头条");
    }

}

运行效果

我是读者1,收到南方日报报纸:今日头条
我是读者2,收到南方报纸:今日头条

总结

  • 在订阅关系确定,不再订阅,注意进行解绑,避免内存泄漏。
  • 观察者模式有利于使依赖性弱化。
  • 所有设计模式的初衷是降低耦合,提高可维护性

相关文章

网友评论

    本文标题:设计模式之观察者模式

    本文链接:https://www.haomeiwen.com/subject/orrpyqtx.html