前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >装饰模式

装饰模式

作者头像
用户1215536
发布2018-02-05 11:08:58
4470
发布2018-02-05 11:08:58
举报

一、相关介绍

1、装饰模式是为已有功能动态地添加更多功能的一种方式。

2、举例:QQ中的服装秀可以动态的搭配不同的服饰来进行修饰。

3、UML图

4、所属类别:结构型

其实其实现就是在具体的装饰类构造过程的输入参数可以是people类,也可以是具体的装饰类,每次添加新装饰功能后,再调用输入参数类的功能。

二、C++程序实现

代码语言:javascript
复制
  1 // 装饰模式应用.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include<iostream>
  6 using namespace std;
  7 
  8 //定义一个纯基类
  9 class Component
 10 {
 11 public:
 12     Component(){}
 13     virtual ~Component(){}
 14     virtual  void operate()=0;
 15 };
 16 
 17 //定义两个需要被装饰的人people1和peopel2
 18 class People1 :public Component
 19 {
 20 public:
 21     People1(){}
 22     virtual ~People1(){}
 23     virtual  void operate(){}
 24 };
 25 class People2 :public Component
 26 {
 27 public:
 28     People2(){}
 29     virtual ~People2(){}
 30     virtual  void operate(){}
 31 };
 32 //定义一个抽象的装饰类
 33 class Decorator :public Component
 34 {
 35 public:
 36     Decorator(Component *cc):ComponentObj(cc){}
 37     //Decorator(Component *cc){}//考虑下如果使用这种构造方式而不是用ComponentObj,并且不对operate()任何操作会对结果产生什么影响
 38     //Decorator(){}//考虑下如果使用这种构造方式会对具体的装饰类产生什么影响
 39     virtual ~Decorator(){}
 40     virtual void operate()
 41     {
 42         if(ComponentObj!=NULL)
 43         {
 44             ComponentObj->operate();
 45         }
 46     }
 47 protected:
 48      Component *ComponentObj;
 49 };
 50 //定义若干个具体的装饰类
 51 class Tshirt:public Decorator
 52 {
 53 public:
 54     Tshirt(Component *com) :Decorator(com){}
 55     //构造Tshirt类的时候需要先构造它的基类Decorator
 56     //而在Decorator类的构造函数Decorator(Component *cc):ComponentObj(cc){}中将输入的值先赋值给ComponentObj了
 57     //将输入参数com复制给Decorator,是为了Decorator::operate();
 58     virtual ~Tshirt(){}
 59     virtual void operate()
 60     {
 61         cout<<"Tshirt"<<endl;
 62         Decorator::operate();
 63     }
 64 };
 65 class Shoes:public Decorator
 66 {
 67 public:
 68     Shoes(Component *com) :Decorator(com){}
 69     virtual ~Shoes(){}
 70     virtual void operate()
 71     {
 72         cout<<"Shoes"<<endl;
 73         Decorator::operate();
 74     }
 75 };
 76 class Suit:public Decorator
 77 {
 78 public:
 79     Suit(Component *com) :Decorator(com){}
 80     virtual ~Suit(){}
 81     virtual void operate()
 82     {
 83         cout<<"Suit"<<endl;
 84         Decorator::operate();
 85     }
 86 };
 87 int _tmain(int argc, _TCHAR* argv[])
 88 {
 89     //新建一个people1
 90     People1 *p1=new People1();
 91     cout<<"Im people1"<<endl;
 92     //给people1穿Tshirt、Suit
 93     Tshirt *T1=new Tshirt(p1);
 94     Suit *S1=new Suit(T1);
 95     S1->operate();
 96 
 97     People2 *p2=new People2();
 98     cout<<"Im people2"<<endl;
 99     //给people1穿Tshirt、Suit
100     Tshirt *T2=new Tshirt(p2);
101     Suit *S2=new Suit(T2);
102     Shoes *SH=new Shoes(S2);
103     SH->operate();
104 
105     return 0;
106 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-01-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档