设计模式学习-装饰模式

1.什么是装饰模式

  装饰模式,在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。动态地给一个对象添加一些额外的职责。这样是能够把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。

2.装饰模式的实现

  在本例子中,举例最常见的人穿衣服的例子,首先我们定义这样一个Person的基类,如下:

#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
class Person
{
public:
    Person(){}
    Person(string n)
    {
        name = n;
    }
    virtual void show()    = 0;
private:
    string name;
};

  在基类下,有着不同种类的人,我们就定义男人这样一个子类如下:

class Men:public Person
{
public:
    Men(string n):name(n){};
    virtual void show()
    {
        cout<<name<<"  de zhuang shi"<<endl;
    }
private:
    string name;
};

  下面我们就要用到一个装饰类,如装饰一个人,我们对装饰类定义如下:

class Finery:public Person
{
public:
    Finery(Person *c)
    {
        component = c;
    }
     virtual void show()
     {
         component->show();
     }
protected:
    Person *component;
};

  在装饰的类下,我们可以定义一个一个的装饰细节,比如我们定义一个Tshirt的类和一个Cap的类:

class Tshirts:public Finery
{
public:
    Tshirts(Person *p):Finery(p)
    {}
    void show()
    {
        component->show();
        add();
    }
    void add()
    {
        cout<<"add Tshirts"<<endl;
    }
};
class Cap:public Finery
{
public:
    Cap(Person *p):Finery(p)
    {}
    void show()
    {
        component->show();
        add();
    }
    void add()
    {
        cout<<"add Cap"<<endl;
    }
};

  在客户端中,我们通过调用

    Person *man = new Men("wq");
    Person *dpa = new Tshirts(man);
    Person *dpb = new Cap(dpa);
    dpb->show(); 

就可以装饰我们实例化的那个人的对象,从这里我们可以看出,首先我们实例化一个叫做wq的对象,然后我们在这个对象之上,实例化一个Tshirt,但是仍然使用基类的指针,同理Cap的实例化过程也是这样的,当我们调用dpb的时候,实际上我们调用的装饰好的对象。

时间: 2024-12-26 18:45:16

设计模式学习-装饰模式的相关文章

swift设计模式学习 - 装饰模式代码大全

装饰模式 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装饰模式的特点 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. 装饰对象包含一个真实对象的引用(reference) 装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. 装饰对象可以在转发这些请求以前或以后增加一些附加功能.这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能.在面向对象的设计中

swift设计模式学习 - 装饰模式

移动端访问不佳,请访问我的个人博客 装饰模式 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 装饰模式的特点 装饰对象和真实对象有相同的接口.这样客户端对象就能以和真实对象相同的方式和装饰对象交互. 装饰对象包含一个真实对象的引用(reference) 装饰对象接受所有来自客户端的请求.它把这些请求转发给真实的对象. 装饰对象可以在转发这些请求以前或以后增加一些附加功能.这样就确保了在运行时,不用修改给定对象的结构就可以在外

学习大话设计模式06_装饰模式

装饰模式(Decorator): 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 1 /** 2 * Component 是定义一个对象接口,可以给这些对象动态地添加职责 3 * @author Monica 4 * 5 */ 6 public abstract class Component { 7 public abstract void Operation(); 8 } 9 10 11 /** 12 * ConcreteComponent 是定义了一个具体

Java设计模式学习记录-装饰模式

前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一些图形界面构件功能的增强等地方都运用了装饰模式. 装饰模式 定义 装饰模式的定义是:在不改变原类文件以及不使用继承的情况下,动态的扩展一个对象的功能.装饰模式是通过创建一个包装对象来实现的,也就是用装饰来包裹真实的对象. 举例 还是老规矩,举例说明,在给亲朋好友过生日时会买生日蛋糕,然后生日蛋糕又有

设计模式学习总结

本文是对各处设计模式示例的总结概括和简化,主要参考 http://blog.csdn.net/zhangerqing/article/details/8194653 直接看本文估计比较枯燥无聊,因为没图~~??,建议对设计模式有兴趣的先看看上面的博文,或者基础比较好可直接移到最底下看下我的各模式一句话概括总结,有什么意见建议欢迎提出~~~~~~~~~~ 总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式.结构型模式,共七种:适配器模式.装饰

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

设计模式学习难度系数排名

这是yqj2065感觉的每个设计模式学习难度系数. 刘伟(Sunny)先生有一个5分制的学习难度,列在模式名称之后. 有几个模式的评价差别很大,抽象工厂模式和享元模式给4分/5,而单例模式1分/5.冠军是一样的. 学习难度系数: ☆☆☆☆☆ ☆☆☆☆☆ 依赖注入模式 静态工厂模式 2 策略模式 1 ★☆☆☆☆ ☆☆☆☆☆ 工厂方法模式 2 模板方法模式 2 适配器模式    2 责任链模式   3 外观模式 1 ★★☆☆☆ ☆☆☆☆☆ 抽象工厂模式  4 桥接模式  3 迭代器    3 享元模

设计模式学习总结系列应用实例

1.单例模式 应用实例:1.一个党只能有一个主席.2.Windows是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行.3.一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件. 2.工厂模式 应用实例:1.你需要一辆汽车,你可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现 2.Hibernate换数据库只需换方言和驱动

设计模式学习笔记(目录篇)

设计模式学习笔记(目录篇) 为了方便查看,特此将设计模式学习笔记系列单独做一个目录. 1   设计模式学习笔记(一:命令模式) 2   设计模式学习笔记(二:观察者模式) 3   设计模式学习笔记(三:装饰模式) 4   设计模式学习笔记(四:策略模式) 5   设计模式学习笔记(五:适配器模式) 6   设计模式学习笔记(六:责任链模式) 7   设计模式学习笔记(七:外观模式) 8   设计模式学习笔记(八:迭代器模式) 9   设计模式学习笔记(九:中介者模式) 10  设计模式学习笔记(