Maison > développement back-end > Tutoriel C#.Net > Modèle de conception C brève introduction au modèle d'observateur

Modèle de conception C brève introduction au modèle d'observateur

黄舟
Libérer: 2017-01-17 13:37:27
original
1214 Les gens l'ont consulté

Modèle d'observateur (Observer) : définit une relation de dépendance un-à-plusieurs, permettant à plusieurs objets observateurs de surveiller un certain objet en même temps. Cet objet sujet informe tous les objets observateurs lorsque son état change, leur permettant de se mettre à jour automatiquement.

Implémentation du modèle :

[code]//观察者抽象基类
class Observer{
public:
    virtual void Update(int) = 0;
};
//主题、目标
class Subject{
public:
    virtual void Attach(Observer *) = 0;  //重视
    virtual void Detach(Observer *) = 0; //脱离
    virtual void Notify() = 0; //通知
};

class ConcreateObserver: public Observer{
private:
    Subject *m_pSubject;   //1.具体观察者,维护一个指向ConcreteSubject对象的引用2.存储有关状态,这些状态应与目标的状态保持一致
public:                     //3.实现Observer的更新接口以使自身状态与目标的状态保持一致
    ConcreateObserver(Subject *pSubject): m_pSubject(pSubject){}
    void Update(int value){
        std::cout << "ConcreateObserver get the update. New State: " << value << std::endl;
    }
};

class ConcreateObserver2: public Observer{
private:
    Subject *m_pSubject;
public:
    ConcreateObserver2(Subject *pSubject):m_pSubject(pSubject){}
    void Update(int value){
        std::cout << "ConcreateObserver2 get the update. New State: " << value << std::endl;
    }
};

//1.将有关状态存入各ConcreateObserver对象
//2.当它的状态发生改变时,向它的各个观察者发出通知
class ConcreateSubject: public Subject{
private:
    std::list<Observer *> m_ObserverList;
    int m_iState;
public:
    void Attach(Observer *pObserver);
    void Detach(Observer *pObserver);
    void Notify();

    void setState(int state){
        m_iState = state;
    }
};
void ConcreateSubject::Attach(Observer *pObserver){
    m_ObserverList.push_back(pObserver);
}
void ConcreateSubject::Detach(Observer *pObserver){
    m_ObserverList.remove(pObserver);
}
void ConcreateSubject::Notify(){
    std::list<Observer *>::iterator it = m_ObserverList.begin();
    while(it != m_ObserverList.end()){
        (*it)->Update(m_iState);
        ++it;
    }
}
Copier après la connexion

Client :

[code]int main(){
    //Create Subject
    ConcreateSubject *pSubject = new ConcreateSubject();

    //Create Observer
    Observer *pObserver = new ConcreateObserver(pSubject);
    Observer *pObserver2 = new ConcreateObserver2(pSubject);

    //Change the state
    pSubject->setState(2);

    //Register the observer
    pSubject->Attach(pObserver);
    pSubject->Attach(pObserver2);

    pSubject->Notify();  //Output: ConcreateObserver get the update. New State: 2 
                                 //ConcreateObserver2 get the update. New State: 2

    //Unregister the observer
    pSubject->Detach(pObserver);

    pSubject->setState(3);

    pSubject->Notify();  //Output: ConcreateObserver2 get the update. New State: 3

    delete pObserver;
    delete pObserver2;
    delete pSubject;
}
Copier après la connexion

Ce qui précède est le contenu du modèle d'observateur dans le modèle de conception C, plus de contenu connexe s'il vous plaît faites attention au site Web PHP chinois (m.sbmmt.com) !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal