C语言
主页 > 软件编程 > C语言 >

C++设计模式中的观察者模式介绍

2022-03-14 | 秩名 | 点击:

设计模式:观察者模式

观察者模式也称发布订阅模式,发布者发布消息,订阅者接收消息。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#ifndef __observerPatterns_publish_hpp__

#define __observerPatterns_publish_hpp__

 

#include "observerPatterns_subscribe.hpp"

 

class observerPatterns_publish

{

public:

    virtual void registerObjectSubscribe(observerPatterns_subscribe *ops) = 0;

    virtual void removeObjectSubscribe(observerPatterns_subscribe *ops) = 0;

    virtual void notifyObjectSubscribe() = 0;

};

 

#endif

1

2

3

4

5

6

7

8

9

10

11

12

#ifndef __observerPatterns_subscribe_hpp__

#define __observerPatterns_subscribe_hpp__

 

#include "observerPatterns_common.hpp"

 

class observerPatterns_subscribe

{

public:

    virtual void update(const observerPatterns_msgPackage &opmp) = 0;

};

 

#endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

#ifndef __observerPatterns_object_publish_hpp__

#define __observerPatterns_object_publish_hpp__

 

#include <unordered_set>

#include "observerPatterns_publish.hpp"

 

class observerPatterns_object_publish : public observerPatterns_publish

{

private:

    observerPatterns_msgPackage _opmp;

    std::unordered_set<observerPatterns_subscribe *> _subscribeObjectBucket;

public:

    observerPatterns_object_publish();

    ~observerPatterns_object_publish();

    void registerObjectSubscribe(observerPatterns_subscribe *ops);

    void removeObjectSubscribe(observerPatterns_subscribe *ops);

    void notifyObjectSubscribe();

    void setMsgPackage(const observerPatterns_msgPackage &opmp);

};

 

observerPatterns_object_publish::observerPatterns_object_publish()

{

}

 

observerPatterns_object_publish::~observerPatterns_object_publish()

{

}

 

void observerPatterns_object_publish::registerObjectSubscribe(observerPatterns_subscribe *ops)

{

    _subscribeObjectBucket.insert(ops);

}

 

void observerPatterns_object_publish::removeObjectSubscribe(observerPatterns_subscribe *ops)

{

    _subscribeObjectBucket.erase(ops);

}

 

void observerPatterns_object_publish::notifyObjectSubscribe()

{

    for (auto &&_sob : _subscribeObjectBucket)

        _sob->update(_opmp);

}

 

void observerPatterns_object_publish::setMsgPackage(const observerPatterns_msgPackage &opmp)

{

    _opmp = opmp;

    notifyObjectSubscribe();

}

 

#endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#ifndef __observerPatterns_object_subscribe_hpp__

#define __observerPatterns_object_subscribe_hpp__

 

#include "observerPatterns_publish.hpp"

#include "observerPatterns_subscribe.hpp"

 

class observerPatterns_object_subscribe : public observerPatterns_subscribe

{

private:

    observerPatterns_msgPackage _opmp;

    observerPatterns_publish *_opb;

public:

    observerPatterns_object_subscribe(observerPatterns_publish *opb);

    ~observerPatterns_object_subscribe();

    void update(const observerPatterns_msgPackage &opmp);

};

 

observerPatterns_object_subscribe::observerPatterns_object_subscribe(observerPatterns_publish *opb)

    :_opb(opb)

{

    _opb->registerObjectSubscribe(this);

}

 

observerPatterns_object_subscribe::~observerPatterns_object_subscribe()

{

    _opb->removeObjectSubscribe(this);

}

 

void observerPatterns_object_subscribe::update(const observerPatterns_msgPackage &opmp)

{

    _opmp = opmp;

    printf("url:%s, msg:%s\n", _opmp.url.c_str(), _opmp.msg.c_str());

}

 

#endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#ifndef __observerPatterns_object_subscribe2_hpp__

#define __observerPatterns_object_subscribe2_hpp__

 

#include "observerPatterns_publish.hpp"

#include "observerPatterns_subscribe.hpp"

 

class observerPatterns_object_subscribe2 : public observerPatterns_subscribe

{

private:

    observerPatterns_msgPackage _opmp;

    observerPatterns_publish *_opb;

public:

    observerPatterns_object_subscribe2(observerPatterns_publish *opb);

    ~observerPatterns_object_subscribe2();

    void update(const observerPatterns_msgPackage &opmp);

};

 

observerPatterns_object_subscribe2::observerPatterns_object_subscribe2(observerPatterns_publish *opb)

    :_opb(opb)

{

    _opb->registerObjectSubscribe(this);

}

 

observerPatterns_object_subscribe2::~observerPatterns_object_subscribe2()

{

    _opb->removeObjectSubscribe(this);

}

 

void observerPatterns_object_subscribe2::update(const observerPatterns_msgPackage &opmp)

{

    _opmp = opmp;

    printf("url:%s, msg:%s\n", _opmp.url.c_str(), _opmp.msg.c_str());

}

 

#endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

#ifndef __observerPatterns_common_hpp__

#define __observerPatterns_common_hpp__

 

#include <string>

 

struct observerPatterns_msgPackage

{

    std::string url;

    std::string msg;

};

 

typedef struct observerPatterns_msgPackage observerPatterns_msgPackage;

 

#endif

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

/************************************************************************

    > File Name: observerPatterns_main.cpp

    > Author:

    > Mail:

    > Created Time:

************************************************************************/

 

#include "observerPatterns_common.hpp"

#include "observerPatterns_object_publish.hpp"

#include "observerPatterns_object_subscribe.hpp"

#include "observerPatterns_object_subscribe2.hpp"

 

using namespace std;

 

int main(int argc, char *argv[])

{

    observerPatterns_object_publish *opop = new observerPatterns_object_publish;

     

    observerPatterns_msgPackage opmp1, opmp2;

    opmp1.url = "www.aaa.com";

    opmp1.msg = "Hello!";

    opmp2.url = "www.xyzxyz.com";

    opmp2.msg = "Hello, observerPatterns!";

     

    observerPatterns_object_subscribe *oposa = new observerPatterns_object_subscribe(opop);

    observerPatterns_object_subscribe *oposb = new observerPatterns_object_subscribe(opop);

    observerPatterns_object_subscribe2 *oposc = new observerPatterns_object_subscribe2(opop);

    observerPatterns_object_subscribe2 *oposd = new observerPatterns_object_subscribe2(opop);

 

    opop->setMsgPackage(opmp1);

    opop->setMsgPackage(opmp2);

     

    delete oposa;

    delete opop;

    return 0;

}

原文链接:https://blog.csdn.net/qq_41245381/article/details/123447036
相关文章
最新更新