设计模式之观察者模式
2019-02-25 本文已影响7人
GitCode8
观察者模式适合在一对多的关系,但被观察者状态或行为的改变需要通知观察者的情况。在平常开发中,观察者 模式是经常使用到的,像Android中的BroadCast,Listener,第三方框架的Rxjava,EventBus。观察者模式相对于其它设计模式来说,比较易懂和易学。属于行为型模式。
下面以例子,讲解设计模式的实际应用和一些概念。
南方日报公司明天都会印发报纸,向订阅报纸的读者送报纸。这里的南方日报公司就是观察者模式中的被观察者,读者就是观察者,两者之间的关系,就是订阅。而公司只有一个,读者可能有0个或者多个,所以是一对多的关系。
- 首先我们定义南方日报公司实体类。也即是观察者模式中的被观察对象,通过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);
}
}
}
- 定义观察者的父类接口,再定义两位读者实现该接口,使其观察南方日报报纸。
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);
}
}
- 当观察者和被观察对象建立订阅关系后,被观察对象在适当时机调用相关方法通知观察者。例如数据发生变化、网络变化等。
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,收到南方报纸:今日头条
总结
- 在订阅关系确定,不再订阅,注意进行解绑,避免内存泄漏。
- 观察者模式有利于使依赖性弱化。
- 所有设计模式的初衷是降低耦合,提高可维护性