作者iamstudent (stu)
看板C_and_CPP
標題Re: [問題] Strategy/State Pattern in C++
時間Sat Apr 23 21:32:40 2011
我自己想出解法了
把很大的class 裡面的成員變數
一起抽出去
然後寫成另外一個繼承體系的protected inner class
讓該繼承體系底下都可以使用
但是要friend原本的大class
讓大class也能使用
然後該繼承體系的物件中
都有一個該inner class的指標
原本很大的class
則擁有該inner class的實體
以及該繼承體系的一個指標
然後把所有工作委託給那個指標來執行
該指標則可以指向不同的實作內容而動態變化工作內容
下面有一個簡化過後的程式碼
測試過可以跑
關係大概是這樣
class A ──────→ abstract class B
* △
|
┌───┼───┐
implement classes C1 C2 C3
資料的空間都還是配置在A物件裡面
而A和B繼承體系的class都可以存取
但是其他以外的class就無法使用資料
擴充新功能只要寫出C4~Cn去繼承B就好
其他現有類別的程式碼全部都不必更動
也不用補新的friend
-----------------------------------------------------------------------------
#include <stdio.h>
class A;
class B;
class C1;
class C2;
class C3;
class B
{
protected:
friend A;
class Inner //原本在A的成員變數都搬到這裡
{
public:
int iData;
//...
};
Inner* m_pInner;
public:
virtual void DoSomething()=0;
};
class C1 : public B
{
public:
void DoSomething()
{
m_pInner->iData = 1;
printf("C1 set data = %d\n", m_pInner->iData);
}
};
class C2 : public B
{
public:
void DoSomething()
{
m_pInner->iData = 2;
printf("C2 set data = %d\n", m_pInner->iData);
}
};
class C3 : public B
{
public:
void DoSomething()
{
m_pInner->iData = 3;
printf("C3 set data = %d\n", m_pInner->iData);
}
};
class A //本來很大的那個class
{
private:
B::Inner m_iData; //實體空間配置
B* m_pB; //指標,可切換處理辦法
public:
inline void SetB(B& rB)
{
m_pB = &rB;
m_pB->m_pInner = &m_iData;
}
inline void DoSomething()
{
m_pB->DoSomething();
}
};
int main()
{
A a;
C1 c1;
C2 c2;
C3 c3;
a.SetB(c1);
a.DoSomething();
a.SetB(c2);
a.DoSomething();
a.SetB(c3);
a.DoSomething();
getchar();
return 0;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.210.62
※ 編輯: iamstudent 來自: 140.113.210.62 (04/23 21:33)
→ loveme00835:你 class 的責任已經亂掉了... 04/23 22:53
→ iamstudent:還好還沒真的這樣改 04/24 01:29
→ iamstudent:看來我分析的功力還是不夠 04/24 01:33