结构型模式 装饰模式

结构型模式 装饰模式

适用于:  装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责。就增加功能来说,此模式比生成子类更为灵活。

/**
 * 结构型模式 装饰模式
 * 装饰( Decorator )模式又叫做包装模式。
 * 通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案。
 * 装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。
 *
 */

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>

class Car
{
public:
    virtual void show() = 0;
};

class RunCar: public Car
{
public:
    void Run()
    {
        std::cout << "可以跑" << std::endl;
    }
    virtual void show() override
    {
        Run();
    }
};

class SwimCarDirector: public Car
{
public:
    SwimCarDirector(Car *car)
    {
        m_car = car;
    }
    void swim()
    {
        std::cout << "可以游" << std::endl;
    }
    virtual void show() override
    {
        m_car->show();
        swim();
    }
private:
    Car *m_car;
};

class FlyCarDirector:public Car
{
public:
    FlyCarDirector(Car *car)
    {
        m_car = car;
    }
    void Fly()
    {
        std::cout << "可以飞" << std::endl;
    }
    virtual void show() override
    {
        m_car->show();
        Fly();
    }
private:
    Car *m_car;
};

void mytest()
{
    Car *runcar = nullptr;
    runcar = new RunCar();
    runcar->show();

    std::cout << "车开始装饰 swim" << std::endl;
    SwimCarDirector *swimcar = new SwimCarDirector(runcar);
    swimcar->show();

    std::cout << "车开始装饰 fly" << std::endl;
    FlyCarDirector *flycar = new FlyCarDirector(runcar);
    flycar->show();

    delete flycar;
    flycar = nullptr;
    delete swimcar;
    swimcar = nullptr;
    delete runcar;
    runcar = nullptr;

    return;
}

int main()
{
    mytest();

    system("pause");
    return 0;
}
时间: 2024-10-05 06:05:30

结构型模式 装饰模式的相关文章

第11章 结构型模式—装饰模式

1. 装饰模式(Decorator Pattern)的定义 (1)动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活. ①装饰模式是为对象(而不是类)添加功能的. ②用组合方式,而不是继承方式为对象添加功能. (2)装饰模式的结构和说明 ①Component:组件对象的接口,可以给这些对象动态地添加职责. ②ConcreteComponent:具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责. ③Decorator:所有装

java设计模式--结构型模式--装饰模式

1 装饰模式 2 概述 3 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 4 5 6 适用性 7 1.在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 8 9 2.处理那些可以撤消的职责. 10 11 3.当不能采用生成子类的方法进行扩充时. 12 参与者 13 1.Component 14 定义一个对象接口,可以给这些对象动态地添加职责. 15 16 2.ConcreteComponent 17 定义一个对象,可以给这个对象添

10 结构型模式-----装饰模式

模式动机(Decorator Pattern):我们在给一个类进行功能扩展时,总是通过继承或者复合关系,使得一个类具有其他相关类型的功能,继承本身属于静态关联,派生类比较臃肿,使用者也不能控制增加功能的方式.而使用复合机制,即将一个类的对象作为另一个类的成员,我们可以决定什么时候调用哪种功能,非常方便,这就是装饰模式,即给一个现有的类进行装饰,使其具有我们希望的功能. 模式结构图: 模式代码: bt_装饰模式.h: 1 #ifndef DP_H 2 #define DP_H 3 #include

设计模式--结构型模式--装饰模式

装饰者模式: 我们可以通过继承和组合的方式来给一个对象添加行为,虽然使用继承能够很好拥有父类的行为,但是它存在几个缺陷: 一.对象之间的关系复杂的话,系统变得复杂不利于维护. 二.容易产生“类爆炸”现象. 三.是静态的.在这里我们可以通过使用装饰者模式来解决这个问题. 装饰者模式,动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案.虽然装饰者模式能够动态将责任附加到对象上,但是他会产生许多的细小对象,增加了系统的复杂度. uml类图如下: 装饰者Decorator与被

7 结构型模式之 - 装饰模式

装饰模式介绍:装饰模式也称为包装模式,是结构型模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一.在现实生活中你也可以看见很多装饰模式的例子,或者可以大胆地说装饰模式无处不在,就拿人来说,人需要各式各样的衣着,不管你穿着怎样,但是,对于个人的本质来说是不变的,充其量只是在外面披上一层包装而已,这就是装饰模式,装饰物也许各不相同但是装饰的对象本质是不变的. 装饰模式的定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更加灵

设计模式(八) : 结构型模式--装饰模式

装饰模式的目的是为了给一个对象动态的增加一些功能.装饰对象和被装饰的对象实现同一个接口,装饰对象持有被装饰对象的实例. 类图: 示意性代码: package com.javadesignpattern.Decorator; public interface Component { void sampleOperation(); } package com.javadesignpattern.Decorator; public class ConcreteComponent implements

结构型模式之装饰模式

概述 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为,在现实生活中,这种情况也到处存在,例如一张照片,我们可以不改变照片本身,给它增加一个相框,使得它具有防潮的功能,而且用户可以根据需要给它增加不同类型的相框,甚至可以在一个小相框的外面再套一个大相框. 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有

设计模式-10 装饰模式(结构型模式)

一 装饰模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 主要解决:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀. 关键代码:1.Component 类充当抽象角色,不应该具体实现. 2.修饰类引用和继承 Component 类,具

设计模式09: Decorator 装饰模式(结构型模式)

Decorator 装饰模式(结构型模式) 子类复子类,子类何其多加入我们需要为游戏中开发一种坦克,除了不同型号的坦克外,我们还希望在不同场合中为其增加以下一种多种功能:比如红外线夜视功能,比如水路两栖功能,比如卫星定位功能等等. 问题代码: /// <summary> /// 抽象坦克 /// </summary> public abstract class Tank { public abstract void Shot(); public abstract void Run(