设计模式《七》——装饰模式

简介

顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

角色与职责

Component:抽象接口,可以给这些对象动态地增加职责。

ConcreteComponent:Component的具体对象,也可以对这个对象添加一下职责。

Decorator:装饰抽闲类,继承自Component,从Decorator的继承类来扩展component的功能。

ConcreteDecorator:具体的装饰对象。

 

实现

#include <iostream>
using namespace std;
class Car {
public:
    Car() {}
    virtual void show() = 0;
};
class RunCar : public Car{
public:
    RunCar() {}
    virtual void show(){
        cout << "可以跑" << endl;
    }
};
class SwimRunCar : public Car{
public:
    SwimRunCar(Car* car){
        m_car = car;
    }
    void swim() {
        cout << "可以游" << endl;
    }
    virtual void show(){
        m_car->show();
        swim();
    }
private:
    Car* m_car;
};
class FlyRunCar : public Car {
public:
    FlyRunCar(Car* car) {
        m_car = car;
    }
    void fly() {
        cout << "可以飞" << endl;
    }
    virtual void show() {
        m_car->show();
        fly();
    }
private:
    Car* m_car;
};
int main(int argc, char* argv[]) {
    Car* car = NULL;
    car = new RunCar;
    car->show();
    SwimRunCar* swimRunCar = new SwimRunCar(car);
    swimRunCar->show();
    FlyRunCar* flyRunCar = new FlyRunCar(swimRunCar);
    flyRunCar->show();
    cin.get();
    return 0;
}

 

补充

代理模式与装饰模式的区别:

 

       这两个图可能使我们产生困惑。这两个设计模式看起来很像。对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个 接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。

        然而,实际上,在装饰器模式和代理模式之间还是有很多差别的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

        我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值