随笔 - 25  文章 - 29  trackbacks - 0
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(4)

随笔分类(22)

随笔档案(25)

文章分类(2)

文章档案(2)

相册

最新随笔

搜索

  •  

积分与排名

  • 积分 - 55692
  • 排名 - 402

最新评论

阅读排行榜

评论排行榜

 

 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 : 定义控制台应用程序的入口点。
 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



       这个decorator 模式例子让初学者 更能加深 多态威力的体会和 decorator 模式 比子类灵活的体会
要注意的问题是:对象链总是在 concreatecomponent  对象处结束。

  ///此处是client 使用 对象的入口点,仅仅得到了 1个 decorator 的派生类对象,client 什么都不知道
printmodel(headdeco(headdeco(enddeco(concreatecom("正文输出中。。。。"),"黄大仙"),2),1));
///

     在vc2005 下通过

posted on 2007-03-22 09:56 黄大仙 阅读(2088) 评论(1)  编辑 收藏 引用 所属分类: c++

FeedBack:
# re: 一个 Decorator 模式 例子(原) 2007-03-23 09:17 Galaxy
不错 , 半年前看过decorator模式,
看了你的例子, 呵呵, 理解的更深了
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理