zoukankan      html  css  js  c++  java
  • 设计模式-Subject(行为模式)

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码

    //Subject.h

    #pragma once
    
    #include<list>
    #include<string>
    
    typedef std::string State;
    
    class Observer;
    class Subject
    {
    public:
        virtual ~Subject();
        virtual void Attach(Observer* obv);
        virtual void Detach(Observer* obv);
        virtual void Notify();
        virtual void SetState(const State& st) = 0;
        virtual State GetState() = 0;
    protected:
        Subject();
    private:
        std::list<Observer*>*_obs;
    };
    
    class ConcreateSubject :public Subject
    {
    public:
        ConcreateSubject();
        ~ConcreateSubject();
        void SetState(const State& st);
        State GetState();
    protected:
    private:
        State _st;
    };

    //Subject.cpp

    #include"Subject.h"
    #include"Observer.h"
    
    #include<iostream>
    #include<list>
    
    typedef std::string state;
    Subject::Subject()
    {
        _obs = new std::list<Observer*>;
    }
    
    Subject::~Subject()
    {}
    void Subject::Attach(Observer* obs)
    {
        _obs->push_front(obs);
    }
    void Subject::Detach(Observer* obs)
    {
        if (obs != NULL)
            _obs->remove(obs);
    }
    void Subject::Notify()
    {
        for (std::list<Observer*>::iterator it = _obs->begin(); it != _obs->end(); ++it)
        {
            (*it)->Update(this);
        }
    }
    
    ConcreateSubject::ConcreateSubject()
    {
        _st = "";
    }
    ConcreateSubject::~ConcreateSubject()
    {
    
    }
    state ConcreateSubject::GetState()
    {
        return _st;
    }
    
    void ConcreateSubject::SetState(const state& st)
    {
        _st = st;
    }

    //Observer.h

    #include"Subject.h"
    #include<string>
    typedef std::string state;
    class Observer
    {
    public:
        virtual ~Observer();
        virtual void Update(Subject* sub) = 0;
        virtual void PrintInfo() = 0;
    protected:
        Observer();
        State _st;
    private:
    };
    
    class ConcreateObserverA :public Observer
    {
    public:
        virtual Subject* GetSubject();
        ConcreateObserverA(Subject* sub);
        virtual ~ConcreateObserverA();
        void Update(Subject* sub);
        void PrintInfo();
    protected:
    private:
        Subject* _sub;
    
    };
    
    class ConcreateObserverB: public Observer
    {
    public:
        virtual Subject* GetSubject();
        ConcreateObserverB(Subject* sub);
        virtual ~ConcreateObserverB();
        void Update(Subject* sub);
        void PrintInfo();
    protected:
    private:
        Subject* _sub;
    };

    //Observer.cpp

    #include"Observer.h"
    #include"Subject.h"
    
    #include<iostream>
    #include<string>
    
    Observer::Observer(){
        _st = '';
    }
    Observer::~Observer(){}
    
    ConcreateObserverA::ConcreateObserverA(Subject* sub)
    {
        _sub = sub;
        _sub->Attach(this);
    }
    ConcreateObserverA::~ConcreateObserverA()
    {
        _sub->Detach(this);
        if (_sub != 0)
            delete _sub;
    }
    
    Subject* ConcreateObserverA::GetSubject()
    {
        return _sub;
    }
    
    void ConcreateObserverA::PrintInfo()
    {
        std::cout << "ConcreateObserverA..." << _sub->GetState() << std::endl;
    
    }
    
    void ConcreateObserverA::Update(Subject* sub)
    {
        _st = sub->GetState();
        PrintInfo();
    }
    
    ConcreateObserverB::ConcreateObserverB(Subject* sub)
    {
        _sub = sub;
        _sub->Attach(this);
    }
    
    ConcreateObserverB::~ConcreateObserverB()
    {
        _sub->Detach(this);
        if (_sub != 0)
            delete _sub;
    }
    
    Subject* ConcreateObserverB::GetSubject()
    {
        return _sub;
    }
    void ConcreateObserverB::PrintInfo()
    {
        std::cout << "ConcreateObserverB..." << _sub->GetState() << std::endl;
    }
    void ConcreateObserverB::Update(Subject* sub)
    {
        _st = sub->GetState();
        PrintInfo();
    }

    //main.cpp

    #include"Observer.h"
    #include"Subject.h"
    #include<iostream>
    #include<string>
    
    int main(int args, char* argv)
    {
        ConcreateSubject* sub = new ConcreateSubject();
        Observer* o1 = new ConcreateObserverA(sub);
        Observer* o2 = new ConcreateObserverB(sub);
        sub->SetState("old");
        sub->Notify();
        sub->SetState("new");
        sub->Notify();
        getchar();
        return 0;
    }
  • 相关阅读:
    Java RunTime Environment (JRE) or Java Development Kit (JDK) must be available in order to run Eclipse. ......
    UVA 1597 Searching the Web
    UVA 1596 Bug Hunt
    UVA 230 Borrowers
    UVA 221 Urban Elevations
    UVA 814 The Letter Carrier's Rounds
    UVA 207 PGA Tour Prize Money
    UVA 1592 Database
    UVA 540 Team Queue
    UVA 12096 The SetStack Computer
  • 原文地址:https://www.cnblogs.com/fourmi/p/12082586.html
Copyright © 2011-2022 走看看