当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
以下属于个人理解,如有错误敬请指正
应用场景:
1.用户信息变更后,系统发送通知消息给用户包含短信通知,邮件通知
2.用户银行卡余额变更,系统发送通微信、短信、以及app推送等
实现方式:
- 定义观察目标接口 Subject
- 定义具体观察目标实现 UserPhoneSubject
- 定义观察者接口 Observer
- 定义具体观察者实现 WeChatMessage EmailMessage(两个观察者)
- 最后定义一个发布类 ContextPublish
//观察目标接口
public interface Subject {
/**
* @method attach
* @description: 添加观察者
*/
void attach(Observer observer);
/**
* @method detach
* @description: 删除观察者
* @param observer
* @return void
*/
void detach(Observer observer);
/**
* @method notify
* @description: 给观察者传递通知信息
* @param message
* @return void
*/
void notify(String message);
}
//观察目标具体实现
public class UserPhoneSubject implements Subject {
List<Observer> observers = new ArrayList<>();
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notify(String message) {
observers.stream().forEach(
observer-> {observer.update(message);}
);
}
}
// 观察者接口
public interface Observer {
/**
* @method update
* @description: 观察者接到通知后的操作
* @param message
* @return void
*/
void update(String message);
}
//具体观察者接口实现 观察者1
public class WeChatMessage implements Observer {
public void update(String message) {
System.out.println("微信发送通知:"+ message);
}
}
//具体观察者接口实现 观察者2
public class EmailMessage implements Observer {
public void update(String message) {
System.out.println("邮件发送通知:"+ message);
}
}
//发布类
public class ContextPublish {
private UserPhoneSubject subject = new UserPhoneSubject();
public ContextPublish(){
List<Observer> observers = new ArrayList<>();
Observer emailMessage = new EmailMessage();
Observer weChatMessage = new WeChatMessage();
observers.add(emailMessage);
observers.add(weChatMessage);
for(Observer observer : observers){
subject.attach(observer);
}
}
public void publish(String message){
subject.notify(message);
}
public class TestPublish {
public static void main(String[] args) {
String message = "电话号码已更改";
ContextPublish contextPublish = new ContextPublish();
contextPublish.publish(message);
}
}
//运行结果
//邮件发送通知:电话号码已更改
//微信发送通知:电话号码已更改
总结
观察目标循环调用观察者的方法