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中如何更换jar包中的.class文件并重新打包
    IIS环境配置和项目部署
    C#中Invoke与BeginInvoke区别
    Windows编程 网络编程基础
    Windows编程 网络编程常见结构体
    什么是OpenGL中的深度、深度缓存、深度测试
    三维场景的渲染优化
    矢量数据转换成栅格数据
    vs2010 c# 配置项问题
    宝宝小时候竟然是近视?
  • 原文地址:https://www.cnblogs.com/fourmi/p/12082586.html
Copyright © 2011-2022 走看看