觀察者模式(ObserverPattern)-創(chuàng)新互聯(lián)

觀察者模式(Observer Pattern)是一種行為型設(shè)計模式,它定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽一個主題對象。這個主題對象在狀態(tài)發(fā)生變化時,會通知所有的觀察者對象,使它們能夠自動更新自己。

在鳳凰等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計、成都網(wǎng)站制作 網(wǎng)站設(shè)計制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營銷推廣,成都外貿(mào)網(wǎng)站制作,鳳凰網(wǎng)站建設(shè)費用合理。

在觀察者模式中,有三個角色:

  • 主題(Subject):主題對象知道它的觀察者,并提供注冊和刪除觀察者的接口。
  • 觀察者(Observer):為那些在目標(biāo)發(fā)生改變時需要獲得通知的對象定義一個更新接口。
  • 具體觀察者(ConcreteObserver):存儲與主題的狀態(tài)自恰的狀態(tài)。具體觀察者角色實現(xiàn)了抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài) 像協(xié)調(diào)。

#include#include// 定義抽象主題類
class Subject
{
public:
    virtual ~Subject() {}
    // 注冊觀察者
    virtual void registerObserver(Observer* observer) = 0;
    // 刪除觀察者
    virtual void removeObserver(Observer* observer) = 0;
    // 通知觀察者
    virtual void notifyObservers() = 0;
};

// 定義抽象觀察者類
class Observer
{
public:
    virtual ~Observer() {}
    // 更新方法
    virtual void update(Subject* subject) = 0;
};

// 定義具體主題類
class ConcreteSubject : public Subject
{
public:
    ConcreteSubject() : state_(0) {}
    // 獲取狀態(tài)
    int getState() const { return state_; }
    // 設(shè)置狀態(tài)
    void setState(int state)
    {
        state_ = state;
        // 狀態(tài)改變,通知所有的觀察者
        notifyObservers();
    }
    void notifyObservers()
    {
        // 遍歷所有的觀察者,調(diào)用更新方法
        for (Observer* observer : observers_)
        {
            observer->update(this);
        }
    }

    void registerObserver(Observer* observer)
    {
        observers_.push_back(observer);
    }

    void removeObserver(Observer* observer)
    {
        // 從觀察者列表中刪除觀察者
        for (auto it = observers_.begin(); it != observers_.end(); ++it)
        {
            if (*it == observer)
            {
                observers_.erase(it);
                break;
            }
        }
    }

private:
    int state_;
    std::vectorobservers_;
};

// 定義具體觀察者類
class ConcreteObserver : public Observer
{
public:
    ConcreteObserver(ConcreteSubject* subject, int id) : subject_(subject), id_(id)
    {
        // 注冊觀察者
        subject_->registerObserver(this);
    }
    ~ConcreteObserver()
    {
        // 刪除觀察者
        subject_->removeObserver(this);
    }
    // 更新方法
    void update(Subject* subject)
    {
        if (subject == subject_)
        {
            std::cout<< "Observer "<< id_<< ": subject state is "<< subject_->getState()<< std::endl;
        }
    }

private:
    ConcreteSubject* subject_;
    int id_;
};

int main()
{
    ConcreteSubject* subject = new ConcreteSubject();
    // 創(chuàng)建觀察者
    Observer* observer1 = new ConcreteObserver(subject, 1);
    Observer* observer2 = new ConcreteObserver(subject, 2);
    // 改變主題的狀態(tài)
    subject->setState(1);
    // 再次改變主題的狀態(tài)
    subject->setState(2);
    // 刪除觀察者
    delete observer1;
    delete observer2;
    delete subject;
    return 0;
}

觀察者模式有以下幾個優(yōu)點:

  • 觀察者模式可以實現(xiàn)表示層和數(shù)據(jù)邏輯層的分離,并使得表示層和數(shù)據(jù)邏輯層的變化獨立。
  • 觀察者模式支持廣播通信。
  • 觀察者模式簡化了對象之間的依賴關(guān)系,每個對象只需保存有關(guān)自己的狀態(tài),無需保存有關(guān)其他對象的狀態(tài),這避免了系統(tǒng)中對象之間的耦合關(guān)系。

觀察者模式也有一些缺點:

  • 觀察者模式會增加系統(tǒng)的復(fù)雜度,因為可能會有很多的觀察者,所以需要維護(hù)這些觀察者之間的注冊關(guān)系。
  • 如果一個觀察者對象的更新操作比較慢,會導(dǎo)致系統(tǒng)的效率降低。
  • 觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目
  • 主題對象與觀察者之間存在較強的耦合關(guān)系,一旦建立了這種關(guān)系,很難撤銷。

  • 主題對象的更新需要通知所有的觀察者,如果觀察者數(shù)量較多,會導(dǎo)致性能下降。

  • 觀察者之間存在循環(huán)依賴關(guān)系時,可能會導(dǎo)致系統(tǒng)崩潰。

  • 主題對象的狀態(tài)發(fā)生變化時,可能會導(dǎo)致觀察者的狀態(tài)發(fā)生變化,這樣就可能會出現(xiàn)無限遞歸的情況。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

名稱欄目:觀察者模式(ObserverPattern)-創(chuàng)新互聯(lián)
新聞來源:http://www.muchs.cn/article38/dhojsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站定制網(wǎng)站、軟件開發(fā)網(wǎng)站設(shè)計、網(wǎng)站制作建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計