zoukankan      html  css  js  c++  java
  • C++设计模式 ==> 装饰(者)模式

    简介

    装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰模式使用对象嵌套的思想,实现对一个对象动态地进行选择性的属性赋予与去除,例如有一篇固定的文本,我们可以给它装饰上“词汇过滤”与“文本加密”两个属性,但同时也要注意装饰顺序:例如文本如果先进行加密操作就没法进行词汇过滤的操作了。
    下面演示一个简单的装饰模式的例子:我们的家(House类)可以进行各种装饰(DecorateTool类),例如添置家具(Furniture子类)添置电器(ElectricApp子类)

    图示

    装饰模式图示

    代码实现

    /////////////////////////////////
    //
    // @Author : PeterZheng
    // @FileName : DecorateModeHeader.h
    // @Date : 2018-08-09 17:23
    //
    /////////////////////////////////
    
    #pragma once
    
    #ifndef DMINCLUDE 
    #define DMINCLUDE
    
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <string>
    #include <tchar.h>
    
    #endif
    
    using namespace std;
    
    class House
    {
    public:
        House() {}
        ~House() {}
        virtual void Show()
        {
            wcout << _T("的房子") << endl;
        }
    };
    
    class DecorateTool :public House
    {
    public:
        DecorateTool(House *h) :hs(h), House() {}
        virtual void Show()
        {
            hs->Show();
        }
    private:
        House * hs;
    };
    
    class Furniture : public DecorateTool
    {
    public:
        Furniture(House *h) :DecorateTool(h) {}
        virtual void Show()
        {
            wcout << _T("摆放了家具的");
            DecorateTool::Show();
        }
    };
    
    class ElectricApp : public DecorateTool
    {
    public:
        ElectricApp(House *h) :DecorateTool(h) {}
        virtual void Show()
        {
            wcout << _T("装有电器的");
            DecorateTool::Show();
        }
    };
    /////////////////////////////////
    //
    // @Author : PeterZheng
    // @FileName : DMdemo.cpp
    // @Date : 2018-08-09 17:23
    //
    /////////////////////////////////
    
    #include "DecorateModeHeader.h"
    
    using namespace std;
    
    int _tmain(void)
    {
        House *myHouse = new House();
        House *fHouse = new Furniture(myHouse);
        House *eapHouse = new ElectricApp(fHouse);
        wcout.imbue(std::locale("chs"));
        eapHouse->Show();
        system("pause");
        return 0;
    }
  • 相关阅读:
    jdbctemplate的batchUpdate使用方法
    js利用html5的canvas实现图像等比例压缩
    js前台通过EXIF.js获取图片中携带的经纬度信息
    Linux expr相关
    expect用于scp传输文件
    linux 自动登录ftp 获取文件
    作业8:单元测试练习(个人练习)
    作业7-用户体验设计案例分析
    作业6:团队作业——学生成绩录入系统设计与实现
    作业5:需求分析
  • 原文地址:https://www.cnblogs.com/csnd/p/12897004.html
Copyright © 2011-2022 走看看