zoukankan      html  css  js  c++  java
  • 设计模式C++学习笔记之十三(Decorator装饰模式)

    装饰模式,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

    13.1.解释

    main(),老爸

    ISchoolReport,成绩单接口

    CFourthGradeSchoolReport,四年级成绩单

    ReportDecorator,成绩单装饰器基类

    HighScoreDecorator,最高分装饰器

    SortDecorator,班级排名装饰器

    说明:对“四年级成绩单”进行装饰,ReportDecorator必然有一个private变量指向ISchoolReport。

    注意:

    看代码:

    // Decorator.cpp//主程序
    #include "stdafx.h"
    #include "ISchoolReport.h"
    #include "FouthGradeSchoolReport.h"
    #include "SugarFouthGradeSchoolReport.h"
    #include "HighScoreDecorator.h"
    #include "SortDecorator.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    void DoIt()
    {
        ISchoolReport *psr = new CSugarFouthGradeSchoolReport();
        psr->Report();//看成绩单
        psr->Sign("老三");//很开心,就签字了
        delete psr;
    }
    void DoNew()
    {
        cout << "----------分部分进行装饰----------" << endl;
        ISchoolReport *psr = new CFouthGradeSchoolReport();//原装成绩单
        //
        ISchoolReport *pssr = new CSortDecorator(psr);//又加了成绩排名的说明
        ISchoolReport *phsr = new CHighScoreDecorator(pssr);//加了最高分说明的成绩单
        phsr->Report();//看成绩单
        phsr->Sign("老三");//很开心,就签字了
       
        //先装饰哪个不重要,顺序已经在装饰内部确定好,但一定要调用最后一个装饰器的接口。
        //ISchoolReport *phsr = new CHighScoreDecorator(psr);//加了最高分说明的成绩单
        //ISchoolReport *pssr = new CSortDecorator(phsr);//又加了成绩排名的说明
        //pssr->Report();//看成绩单
        //pssr->Sign("老三");//很开心,就签字了

        delete pssr;
        delete phsr;
        delete psr;
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        //在装饰之前,可以用继承的办法,来进行简单的修饰
        DoIt();

        //但如果需要修饰的项目太多呢?或者装饰的项目不是固定的,继承显然会变得更复杂
        DoNew();

        _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
        _CrtDumpMemoryLeaks();
        return 0;
    }

    //ISchoolReport.h

    #pragma once
    #include <iostream>
    using std::string;
    class ISchoolReport
    {
    public:
        ISchoolReport(void)
        {
        }
        virtual ~ISchoolReport(void)
        {
        }
        virtual void Report() = 0;
        virtual void Sign(string name) = 0;
    };

    //FouthGradeSchoolReport.h

    #pragma once
    #include "ischoolreport.h"
    class CFouthGradeSchoolReport :
        public ISchoolReport
    {
    public:
        CFouthGradeSchoolReport(void);
        ~CFouthGradeSchoolReport(void);
        void Report();
        void Sign(string name);
    };

    //FouthGradeSchoolReport.cpp

    #include "StdAfx.h"
    #include "FouthGradeSchoolReport.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    using std::string;
    CFouthGradeSchoolReport::CFouthGradeSchoolReport(void)
    {
    }
    CFouthGradeSchoolReport::~CFouthGradeSchoolReport(void)
    {
    }
    void CFouthGradeSchoolReport::Report()
    {
        cout << "尊敬的XXX家长:" << endl;
        cout << "......" << endl;
        cout << "语文62  数学65  体育98  自然63" << endl;
        cout << "......" << endl;
        cout << "                家长签名:" << endl;
    }
    void CFouthGradeSchoolReport::Sign(string name)
    {
        cout << "家长签名为:" << name.c_str() << endl;
    }

    //ReportDecorator.h

    #pragma once
    #include "ischoolreport.h"
    class CReportDecorator :
        public ISchoolReport
    {
    public:
        CReportDecorator(ISchoolReport *psr);
        virtual ~CReportDecorator(void);
        void Report();
        void Sign(string name);
    private:
        ISchoolReport *m_pSchoolReport;
    };

    //ReportDecorator.cpp

    #include "StdAfx.h"
    #include "ReportDecorator.h"
    #include <iostream>
    using std::string;
    CReportDecorator::CReportDecorator(ISchoolReport *psr)
    {
        this->m_pSchoolReport = psr;
    }
    CReportDecorator::~CReportDecorator(void)
    {
    }
    void CReportDecorator::Report()
    {
        this->m_pSchoolReport->Report();
    }
    void CReportDecorator::Sign( string name )
    {
        this->m_pSchoolReport->Sign(name);
    }

    //HighScoreDecorator.h

    #pragma once
    #include "reportdecorator.h"
    #include "ISchoolReport.h"
    class CHighScoreDecorator :
        public CReportDecorator
    {
    public:
        CHighScoreDecorator(ISchoolReport *psr);
        ~CHighScoreDecorator(void);
        void Report();
    private:
        void ReportHighScore();
    };

    //HighScoreDecorator.cpp

    #include "StdAfx.h"
    #include "HighScoreDecorator.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    CHighScoreDecorator::CHighScoreDecorator( ISchoolReport *psr ) : CReportDecorator(psr)
    {
    }
    CHighScoreDecorator::~CHighScoreDecorator(void)
    {
    }
    void CHighScoreDecorator::Report()
    {
        this->ReportHighScore();
        this->CReportDecorator::Report();
    }
    void CHighScoreDecorator::ReportHighScore()
    {
        cout << "这次考试语文最高是75, 数学是78, 自然是80" << endl;
    }

    //SortDecorator.h

    #pragma once
    #include "reportdecorator.h"
    #include "ISchoolReport.h"
    class CSortDecorator :
        public CReportDecorator
    {
    public:
        CSortDecorator(ISchoolReport *psr);
        ~CSortDecorator(void);
        void Report();
    private:
        void ReportSort();
    };
    //SortDecorator.cpp

    #include "StdAfx.h"
    #include "SortDecorator.h"
    #include <iostream>
    using std::cout;
    using std::endl;
    CSortDecorator::CSortDecorator( ISchoolReport *psr ) : CReportDecorator(psr)
    {
    }
    CSortDecorator::~CSortDecorator(void)
    {
    }
    void CSortDecorator::ReportSort()
    {
        cout << "我是排名第38名..." << endl;
    }
    void CSortDecorator::Report()
    {
        this->CReportDecorator::Report();
        this->ReportSort();
    }

    这也是一个比较简单的模式,属于行为型模式。

  • 相关阅读:
    【C#】3.算法温故而知新
    【C#】2.算法温故而知新
    【C#】1.算法温故而知新
    【C#】SQL数据库助手类2.0(自用)
    【Javascript Demo】JS获取当前对象大小以及屏幕分辨率等
    【Android 基础】Android中全屏或者取消标题栏
    【ASP.NET 问题】System.InvalidOperationException: 对象的当前状态使该操作无效 【大量表单数据提交】错误解决
    【CSS】颜色码对照表
    【Ext.Net学习笔记】07:后续
    【Ext.Net学习笔记】06:Ext.Net GridPanel的用法(GridPanel 折叠/展开行、GridPanel Selection、 可编辑的GridPanel)
  • 原文地址:https://www.cnblogs.com/wanggary/p/2020254.html
Copyright © 2011-2022 走看看