學習筆記:設計模式之觀察者模式

本文僅供學習交流使用,侵權必刪。
不作商業(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í)行時間

持續(xù)更新...

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容