观察者模式
1.定义:
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态时,则所有依赖它的对象都会得到通知,并自动更新。
2.使用场景:
- 关联行为场景,注意,关联行为是可拆分的,而不是‘组合’关系;
- 事件多级触发场景;
- 跨系统的消息交换场景,如消息队列、事件总线的处理机制。
3.UML图
4.详解:
观察者模式又称为发布-订阅模式,是一种使用频率非常高的设计模式,它常用的地方是GUI系统,订阅-发布系统,是一种行为型设计模式。观察者模式的主要作用是使得对象解耦,将观察者与被观察者完全隔离,仅依赖于Observer接口与Observable类。
- 优点:观察者与被观察者之间是抽象耦合,应对业务变化;增强系统灵活性、可扩展性。
- 缺点:在应用观察者模式时需要考虑开发效率和运行效率的问题,程序中包括一个被观察者、多个观察者、开发和调试等内容会比较复杂,而且在java中消息的通知默认是顺序执行,一旦某个观察者卡顿,会影响整体的执行效率,在这种情况下,一般考虑采用异步的方式。
下面就以程序猿订阅某网站的内容举例,详见代码:
public static class Coder implements Observer {
private String name;
public Coder(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println("Hi," + name + ",你订阅的Android前沿技术有最新发布,内容:" + arg.toString() + ",请前往查看!");
}
}
这里定义了订阅者的实现类Coder,它实现Observer接口,并重写update方法。
接着是发布者的具体类,它继承Observable即可,至于更新方法可自定义,这里是notice:
public static class Publisher extends Observable {
public void notice(String content) {
setChanged();//标识状态或内容发生改变
notifyObservers(content);//通知所有订阅者
}
}
测试代码:
public static void main(String[] args) {
Publisher publisher = new Publisher();//创建发布者
Coder coder_a = new Coder("coder_A");//创建订阅者
Coder coder_b = new Coder("coder_B");
Coder coder_c = new Coder("coder_C");
publisher.addObserver(coder_a);//将订阅者注册到发布列表中
publisher.addObserver(coder_b);
publisher.addObserver(coder_c);
publisher.notice("Android注解annotation");//发布消息
/**
Hi,coder_C,你订阅的Android前沿技术有最新发布,内容:Android注解annotation,请前往查看!
Hi,coder_B,你订阅的Android前沿技术有最新发布,内容:Android注解annotation,请前往查看!
Hi,coder_A,你订阅的Android前沿技术有最新发布,内容:Android注解annotation,请前往查看!
*/
}