大话设计模式--装饰模式 C++简单例子

装饰模式在对象动态增加功能方面优于继承,用装饰模式替代继承,比继承更加灵活。

小菜扮靓第三版

class person
{
public:
    virtual void show(){
        cout << "汤姆: " ;
    }
};

class decorator :public person
{
public:
    person *m_a;//被装饰者
    void decorate(person* a){
        m_a = a;
    }
    //void show(){
    //    if (m_a != nullptr){
    //        m_a->show();
    //    }
    //}
};

class Tshirt : public decorator
{
public:
    void show(){
        m_a->show();//被装饰者先执行
        cout << "T恤 ";
        //decorator::show();
    }
};

class shores : public decorator
{
public:
    void show(){
        m_a->show();
        cout << "鞋子 ";
        //decorator::show();
    }
};

int main()
{
    person *Tom=new person();
    Tshirt *Gucci=new Tshirt();
    shores *Vans=new shores();

    Gucci->decorate(Tom);//Gucci的m_a为person类
    Vans->decorate(Gucci);//Vans的m_a为Tshirt类
    Vans->show();

    return 0;
}

小菜扮靓第二版

class person
{
public:
    virtual void show(){}
};

class Tom : public person
{
public:
    void show(){
        cout << "汤姆: ";
    }
};
class Jerry : public person
{
public:
    void show(){
        cout << "杰瑞: ";
    }
};

class decorator :public person
{
public:
    person *m_a;
    void decorate(person* a){
        m_a = a;
    }
    //void show(){
    //    if (m_a != nullptr){
    //        m_a->show();
    //    }
    //}
};

class Tshirt : public decorator
{
public:
    void show(){
        m_a->show();
        cout << "T恤 ";
        //decorator::show();
    }
};

class shores : public decorator
{
public:
    void show(){
        m_a->show();
        cout << "鞋子 ";
        //decorator::show();
    }
};

int main()
{
    //person *tom = new Tom();
    //Tshirt *Gucci = new Tshirt();
    //shores *Vans = new shores();

    //Gucci->decorate(tom);
    //Vans->decorate(Gucci);
    //Vans->show();

    person *jerry = new Jerry();
    Tshirt *Gucci = new Tshirt();
    shores *Vans = new shores();

    Gucci->decorate(jerry);
    Vans->decorate(Gucci);
    Vans->show();
    return 0;
}

原文地址:https://www.cnblogs.com/hustwx/p/9379971.html

时间: 2024-10-10 14:19:33

大话设计模式--装饰模式 C++简单例子的相关文章

大话设计模式-第一章-简单工厂模式

一.UML图 二.包含的角色 简单工厂模式包含三个角色:(1)工厂类Factory(2)抽象产品类AbstractProduct(3)具体产品类ConcreteProduct. (1)Factory:工厂类是用来制造产品的.因此,在Factory中有一个用于制造产品的Create函数或者Generate函数之类的函数.这个函数能够根据"标识符"的不同生成不同的ConcreteProduct,当然这些ConcreteProduct都是继承自AbstractProduct的. (2)Abs

大话设计模式-装饰模式(C++)

<大话设计模式>的装饰模式的C++实现. 结构图: Decorator.h: #ifndef _DECORATOR_H #define _DECORATOR_H #include <iostream> #include <string> using namespace std; //ConcreteComponent类 class CPerson { public: CPerson(){}; CPerson(string str):m_sName(str){}; vir

大话设计模式C++版——简单工厂模式

简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器. 1.抽象接口类--依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程) class IOperation { public: IOperation() : m_nNuml(0), m_nNumr(0) {} virtual ~IOperation() {} virtual void SetNum(int nNuml = 0, int nNumr = 0) { m_nNuml = nN

大话设计模式—装饰模式

装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 大话设计模式中程杰老师给出的定义,装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活. 装饰模式结构图如下: 关键代码: 1.Component 类充当抽象角色,不应该具体实现. 2.修饰类引用和继承

[大话设计模式]学习笔记——简单工厂模式

序 说好的每天进步一点点的,结果工作太忙,一直在加班,都没有学习新东西.我还要进BAT呢. 坚持每天学习新东西. 写代码时,意识到在代码结构上还是有点欠缺.赶紧补上. 纪录对设计模式的认识.小菜变大鸟.进攻BAT. 应用场景: 编写一个计算器控制台程序,要求输入两个数和运算符号,得到结果. 这本书使用C#写的.已有博主用JAVA写出来,参考:http://blog.csdn.net/ghsau/article/details/8163418 常见的做法: 写一个方法封装计算机的功能,我们只需传参

大话设计模式--第一章 简单工厂设计模式

简单工厂设计模式 案例: 写一个计算器, 实现加减乘除. 第一步: 写一份简单的代码 package com.chapter1; public class Caculator1 { public static void main(String[] args) { if(args.length < 3){ System.out.println("参数个数异常"); return ; } Double num1 = Double.parseDouble(args[0]); Doubl

大话设计模式---装饰模式

装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类.同样道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把Decorator和ConcreteDecorator的责任合并成一个类. 总结:当系统需要新功能的时候,是向旧的类中添加新的代码.

大话设计模式第一章-简单工厂模式

1 简单工厂模式--uml   继承关系--空心三角形--实线 实线接口 空心三角形--实虚线 聚合关系  空心菱形---实线箭头    雁群和大雁 组合关系-  实心菱形---实线箭头   鸟和翅膀 依赖关系-虚线箭头  如动物需要氧气和水  d 简单工厂模式demo--本地demo 库 原文地址:https://www.cnblogs.com/spps/p/9942846.html

大话设计模式C++版——表驱动法改造简单工厂

上回<大话设计模式C++版--简单工厂模式>中指出了简单工厂模式的缺陷,即违背了开发-封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,如何改造switch结构,表驱动法就可以粉墨登场了. 表驱动法的介绍见<数据驱动编程之表驱动法>. 1.面向接口编程,先改造抽象接口类IOperation class IOperation { public: IOperation() : m_nNuml(0), m_nNumr(0) {} vi