本文僅供學習交流使用,侵權必刪。
不作商業(yè)用途,轉載請注明出處
WHAT 什么是觀察者模式

觀察者UML
觀察者模式(Observer Design Pattern)就是對象之間存在一對多的依賴關系,當被依賴對象(被觀察者)的狀態(tài)發(fā)生改變的時候,所有依賴對象(觀察者)都會收到通知信息。
觀察者模式在很多框架都有應用到,像Google Guava的EventBus以及Spring Framework等都用到觀察者模式。
WHY 為什么使用觀察者模式
優(yōu)點
- 將觀察者和被觀察者進行解耦,符合單一職責原則。
- 提高擴展性,如果需要再添加新的業(yè)務功能,只需要添加新的觀察者即可,無需修改原來的代碼
缺點
- 需要通知的觀察者較多的話,這個通知過程耗費時間較長
HOW觀察者模式的實現(xiàn)(JAVA)
場景:一個用戶注冊接口,在注冊主流程完成后,通知觀察者執(zhí)行對應的邏輯。
- 觀察者接口
/**
* 觀察者接口和對應的實現(xiàn)類
*/
public interface Observer {
void execute(Message message);
}
/**
* 郵件發(fā)送
*/
public class EmailObserver implements Observer {
@Override
public void execute(EventMessage message) {
System.out.println("EmailObserver execute");
}
}
/**
* 增加積分
*/
public class RewardPointObserver implements Observer {
@Override
public void execute(EventMessage message) {
System.out.println("RewardPointObserver execute");
}
}
- 事件消息
public class EventMessage {
private String id;
private String data;
private Date createTime;
public EventMessage(String data) {
this.id = UUID.randomUUID().toString();
this.data = data;
this.createTime = new Date();
}
public String getId() {
return id;
}
public String getData() {
return data;
}
public Date getCreateTime() {
return createTime;
}
}
- 被觀察者:用戶接口和實現(xiàn)類
/**
* 用戶注冊服務
*/
public interface IUserService {
void register();
}
/**
* 用戶服務實現(xiàn)類
*/
public class UserServiceImpl implements IUserService {
private static List<Observer> observers = new ArrayList<>();
static {
observers.add(new EmailObserver());
observers.add(new RewardPointObserver());
}
@Override
public void register() {
EventMessage message = new EventMessage("{'user_name':'kg_papa','email':'xxx@163.com'}");
observers.forEach(observer -> observer.execute(message));
}
}
這個功能場景有個地方可以優(yōu)化下,對于通知觀察者這個操作,我們可以通過異步的方式進行通知,這樣能夠縮短整個注冊功能的執(zhí)行時間