• 装饰模式


    一、相关介绍

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

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

    3、UML图

    4、所属类别:结构型

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

    二、C++程序实现

      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 }
  • 相关阅读:
    Javascript Promise技术
    什么是CPS
    移动端input file 提示没有应用可执行此操作
    黄聪:wordpress+Windows下安装Memcached服务及安装PHP的Memcached扩展
    黄聪:Windows下安装Memcached服务及安装PHP的Memcached扩展
    用VScode配置Python开发环境
    在VSCode中使用码云(Gitee)进行代码管理
    网页链接分享到微信朋友圈带图标和摘要的完美解决方法
    解决百度统计被刷广告的办法,屏蔽非法广告
    Visual Studio代码PHP Intelephense继续显示不必要的错误
  • 原文地址:https://www.cnblogs.com/bewolf/p/4225004.html
Copyright © 2020-2023  润新知