版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/slh2016/article/details/85035057
概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
使用场景:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。
优劣:
- 优点:观察者和被观察者是抽象耦合,松耦合;
- 缺点:被观察者(目标)对象有很多直接或间接的观察者时,通知时间变长;观察者与被观察者相互依赖、通知的话会造成死循环系统崩溃;观察者只知道结果的变化,具体目标对象如何变化的无法知道。
示例:
package designPattern.observer;
/**
* 被观察者接口
* 定义了添加、删除、发送通知方法
* @author sunlh
*
*/
public interface Observerable {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver(String message);
}
package designPattern.observer;
/**
* 观察者接口
* 被观察者调用notifyObserver()时,调用此update()方法
* @author sunlh
*
*/
public interface Observer {
void update(String message);
}
package designPattern.observer;
import java.util.ArrayList;
import java.util.List;
/**
* 被观察者对象
* 实现注册观察对象,撤销观察对象和通知的方法
* 定义List变量存储所有的观察者对象
* @author sunlh
*
*/
public class WechatServer implements Observerable{
private List<Observer> observers;
private String message;
public WechatServer() {
observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
if (observer != null) {
observers.add(observer);
}
}
@Override
public void removeObserver(Observer observer) {
if (!observers.isEmpty() && observer != null) {
observers.remove(observer);
}
}
@Override
public void notifyObserver(String message) {
this.message = message;
System.out.println("微信服务更新消息:" + message);
for (Observer observer : observers) {
observer.update(this.message);
}
}
}
package designPattern.observer;
public class User1 implements Observer{
private String name;
private String message;
public User1(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
System.out.println(name + "接收到消息:" + this.message);
}
}
package designPattern.observer;
public class User2 implements Observer{
private String name;
private String message;
public User2(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
System.out.println(name + "接收到消息:" + this.message);
}
}
package designPattern.observer;
public class User3 implements Observer{
private String name;
private String message;
public User3(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
System.out.println(name + "接收到消息:" + this.message);
}
}
package designPattern.observer;
/**
* 测试类
* @author sunlh
*
*/
public class Test {
public static void main(String[] args) {
// 定义具体观察者
Observer user1 = new User1("张三");
Observer user2 = new User2("李四");
Observer user3 = new User3("王五");
// 定义被观察者
Observerable wechatServer = new WechatServer();
// 注册观察者
wechatServer.registerObserver(user1);
wechatServer.registerObserver(user2);
wechatServer.registerObserver(user3);
// 目标发布消息,观察者接收
wechatServer.notifyObserver("Java是世界上最好的语言");
wechatServer.removeObserver(user2);
wechatServer.notifyObserver("汉语是世界上最好的语言");
}
}
测试结果:
微信服务更新消息 Java是世界上最好的语言
张三接收到消息:Java是世界上最好的语言
李四接收到消息:Java是世界上最好的语言
王五接收到消息:Java是世界上最好的语言
微信服务更新消息:汉语是世界上最好的语言
张三接收到消息:汉语是世界上最好的语言
王五接收到消息:汉语是世界上最好的语言