Java 杂谈我们的2019设计模式

设计模式之观察者模式

2019-02-25  本文已影响7人  GitCode8

观察者模式适合在一对多的关系,但被观察者状态或行为的改变需要通知观察者的情况。在平常开发中,观察者 模式是经常使用到的,像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,收到南方报纸:今日头条

总结

上一篇下一篇

猜你喜欢

热点阅读