C++设计模式之相互包含的类

实际情况中,经常会用到两个相互访问的类,当然这种情况最好能避免,但有时候是必须的。
一种情景:Manager要安排一些任务给Worker,但Worker工作起来是异步模式的(Manager安排完任务就去忙别的事情了,不会等待Worker工作完成),Worker需要在任务完成后通知Manager以便Manager能够掌握公司的总体运营情况。

技术实现:如果是窗口的话,可以给各自关联的句柄SendMessage,但大多数情况下,Manager和Worker都是功能类,没有句柄的。
如果头文件相互包含,编译器会报错的。
耍点小聪明吧:
Manager.h中包含Worker.h 并且Manager的成员包括几个Worker
Worker.h中 前向声明 class Manager(这时候如果编译,编译器会报错:Manager类声明了但是没有实现),然后在Worker.cpp中包含Manager.h(.cpp文件时不会被include的)
同时因为Worker在JobDone后反馈给Manager,因此Manger在OrderWork的时候要传进来一个本身的线索,这样Worker才能找到Manager的办公室啊:)

+PS+: 后来又想到一种方法,使用第三方的一个类。将两个对象都传递给第三方的一个对象,也可以。

Manager.h:

#pragma once

#include "Worker.h"

class CManager
{
public:
    CManager(char* name);
    ~CManager(void);

    void OrderWork();
    void Roger();

public:
    CString    m_name;
    CWorker* m_worker;
};

Manager.cpp:

#include "Manager.h"
#include "stdafx.h"

CManager::CManager(char* name)
{
    m_name = name;
    m_worker = new CWorker("Peter");
}

CManager::~CManager(void)
{
}

void CManager::OrderWork()
{
    CString str;
    str = "I'm Manger ";
    str += m_name.GetBuffer();
    str += ". Now i give some work to Peter(my worker): ";
    wcout<<str.GetBuffer()<<endl;

    m_worker->DoJob(this);
}

void CManager::Roger()
{
    CString str;
    str = "I'm Manager ";
    str += m_name.GetBuffer();
    str += ". i just received a job-done report from Peter.";
    wcout<<str.GetBuffer()<<endl;

}

Worker.h:

#pragma once

#include "stdafx.h"

class CManager; //forward declaration

class CWorker
{
public:
    CWorker(char* name);
    ~CWorker(void);

    void DoJob(CManager* who2report);
    void JobIsDone(CManager* who2report);

private:
    CString m_name;
};

Worker.cpp:

#include "Worker.h"
#include "stdafx.h"
#include "Manager.h"


CWorker::CWorker(char* name)
{
    m_name = name;
}

CWorker::~CWorker(void)
{
}

void CWorker::DoJob(CManager* who2report)
{
    CString str;
    str = "I'm ";
    str += m_name.GetBuffer();
    str += ". And now i'm doing my job..";
    wcout<<str.GetBuffer()<<endl;

    int last = 100000;
    while(last--);

    JobIsDone(who2report);
}

void CWorker::JobIsDone(CManager* who2report)
{
    CString str;
    str = "I'm ";
    str += m_name.GetBuffer();
    str += ". My job is done.";
    wcout<<str.GetBuffer()<<endl;

    who2report->Roger();
}

测试代码:

#include "stdafx.h"
#include "Manager.h"

void main()
{
    CManager man1("Boss1");
    man1.OrderWork();

    cout<<endl;
    CManager man2("Boss2");
    man2.OrderWork();

    system("pause");
}

运行结果:

I'm Manger Boss1. Now i give some work to Peter(my worker):
I'm Peter. And now i'm doing my job..
I'm Peter. My job is done.
I'm Manager Boss1. i just received a job-done report from Peter.

I'm Manger Boss2. Now i give some work to Peter(my worker):
I'm Peter. And now i'm doing my job..
I'm Peter. My job is done.
I'm Manager Boss2. i just received a job-done report from Peter.
请按任意键继续. . .

posted @ 2013-12-18 13:58  Tup  阅读(680)  评论(0)    收藏  举报