?
?1
#pragma?once
?2
?3
class?component
?4
{
?5
public
:
?6
????component(void);
?7
??virtual?void?printsefl()
=
0
???;
?8
public
:
?9
????virtual?~component(void);
10
};
11
12
class?concreatecom?:
public
?component
13
{
14
public
:
15
????concreatecom(char
*
?);
16
??virtual?void?printsefl()???;
17
??virtual?~concreatecom(void);
18
protected:
19
private
:
20
char?
*
?_psz_text;
21
};
22
23
class?decorator:
public
?component
24
{
25
public
:
26
?????decorator(component
&
);
27
??virtual?void?printsefl()?????;
28
??virtual?~decorator();
29
protected:
30
31
private
:
32
???component?
&
?_pcomponent;
33
};
34
class??headdeco:
public
?decorator
35
{
36
public
:
37
???????headdeco(component
&
,
int
);
38
???virtual?void?printsefl()???;
39
???virtual?~headdeco();
40
protected:
41
????virtual?void?printhead()??;
42
private
:
43
int
?_i_head;
44
};
45
46
class?enddeco:
public
?decorator
47
{
48
public
:
49
??????enddeco(component
&
,char
*
);
50
????virtual?void?printsefl()?;
51
????virtual??~enddeco();
52
protected:
53
??????virtual?void?printend()?;
54
private
:
55
?char
*
?_pch_end;
56
};
?1
#include?
"
StdAfx.h
"
?2
#include?
<
iostream
>
?3
#include?
"
component.h
"
?4
using?namespace?std;
?5
?6
component::component(void)
?7
{
?8
}
?9
10
component::~component(void)
11
{
12
}
13
14
void?concreatecom::printsefl()?
15
{
16
???cout
<<
endl;
17
???cout
<<
_psz_text?;
18
???cout
<<
endl;
19
}
20
?concreatecom::concreatecom(char
*
?psz)
21
{
22
??????_psz_text
=
psz;
23
}
24
?decorator::decorator(component
&
?a):
25
???_pcomponent(a)
26
{
27
??
28
}
29
concreatecom::~concreatecom()
30
{
31
32
}
33
void?decorator::printsefl()
34
{
35
_pcomponent.printsefl();
36
????
37
}
38
39
decorator::~decorator()
40
{
41
42
}
43
44
?headdeco::headdeco(component?
&
?refcom,?
int
?i):
45
??decorator(refcom)
46
?,_i_head(i)
47
{
48
49
}
50
void?headdeco::printsefl()?
51
{?
52
???printhead();
53
???decorator::printsefl();
54
???
55
}
56
void?headdeco::printhead()?
57
{
58
????cout
<<
endl;
59
???cout
<<
_i_head;
60
???cout
<<
endl;
61
}
62
headdeco::~headdeco()
63
{
64
?
65
}
66
67
enddeco::enddeco(component?
&
?refcom,char?
*
?pch)
68
:decorator(refcom)
69
,_pch_end(pch)
70
{
71
???
72
}
73
void?enddeco::printsefl()?
74
{
75
????decorator::printsefl();
76
????printend();
77
}
78
void?enddeco::printend()??
79
{
80
????cout
<<
endl;
81
????cout
<<
_pch_end;
82
????cout
<<
endl;
83
}
84
enddeco::~enddeco()
85
{
86
87
}
?1
//
?decorator.cpp?:?定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
?2
//
?3
?4
#include?
"
stdafx.h
"
?5
#include?
<
iostream
>
?6
#include?
"
component.h
"
?7
using?namespace?std;
?8
?9
?void?printmodel(component
&
?pcom?)
10
{
11
????pcom.printsefl();
12
}
13
int
?_tmain(
int
?argc,?_TCHAR
*
?argv[])
14
{
15
?????
16
????printmodel(headdeco(headdeco(enddeco(concreatecom(
"
正文輸出中。。。。
"
),
"
黃大仙
"
),
2
),
1
));
17
????return?
0
;
18
}
19
?????? 這個(gè)decorator 模式例子讓初學(xué)者 更能加深 多態(tài)威力的體會(huì)和 decorator 模式 比子類(lèi)靈活的體會(huì)
要注意的問(wèn)題是:對(duì)象鏈總是在 concreatecomponent? 對(duì)象處結(jié)束。
? ///此處是client 使用 對(duì)象的入口點(diǎn),僅僅得到了 1個(gè) decorator 的派生類(lèi)對(duì)象,client 什么都不知道
printmodel(headdeco(headdeco(enddeco(concreatecom("正文輸出中。。。。"),"黃大仙"),2),1));
///
???? 在vc2005 下通過(guò)
posted on 2007-03-22 09:56
黃大仙 閱讀(2125)
評(píng)論(1) 編輯 收藏 引用 所屬分類(lèi):
c++