图片引用于百度
简介:装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性地替代方案。。
优点:能够动态的将新功能加在对象上,相比继承更加弹性
缺点:使用装饰模式会产生比继承更多的对象,查错比较困难
例子背景:现在需要组装一台电脑主机,而主机的各个部件都不相同,我们需要根据不同的主机构建不同的部件,然后组装它
概念:动态给对象增加功能,从一个对象的外部来给对象添加功能,当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列的装饰器装饰过后的对象
装饰者模式代码:
- 被装饰的基类:
#pragma once
#include <string>
#include <iostream>
using namespace std;
class Mainframe
{
public:
Mainframe() {}
virtual ~Mainframe() {}
virtual string GetName() { return m_name; }
virtual double GetPrice() = 0;
protected:
string m_name;
};
- 被装饰的类:
#pragma once
#include "Mainframe.h"
class i7Mainframe : public Mainframe
{
public:
i7Mainframe()
{
m_name.append("i7主机");
}
virtual ~i7Mainframe() {}
virtual double GetPrice()
{
return m_price;
}
private:
double m_price = 11899;
};
- 装饰者基类:
#pragma once
#include "Mainframe.h"
class Accessories : public Mainframe
{
public:
Accessories(Mainframe* mf) : m_mainframe(mf) {}
virtual ~Accessories() { delete m_mainframe; }
virtual string GetName() = 0;
protected:
Mainframe* m_mainframe = nullptr;
};
- 装饰者类1:
#pragma once
#include "Accessories.h"
class AccessoriesHardDisk : public Accessories
{
public:
AccessoriesHardDisk(Mainframe* mf) : Accessories(mf) {}
~AccessoriesHardDisk() {}
virtual string GetName()
{
return m_mainframe->GetName().append(" 加1t机械硬盘");
}
virtual double GetPrice()
{
return m_mainframe->GetPrice() + 399;
}
};
- 装饰者类2:
#pragma once
#include "Accessories.h"
class AccessoriesMemoryBank : public Accessories
{
public:
AccessoriesMemoryBank(Mainframe* mf) : Accessories(mf) {}
~AccessoriesMemoryBank() {}
virtual string GetName()
{
return m_mainframe->GetName().append(" 加16G内存条");
}
virtual double GetPrice()
{
return m_mainframe->GetPrice() + 1099;
}
};
- 引用:
#include "i7Mainframe.h"
#include "AccessoriesHardDisk.h"
#include "AccessoriesMemoryBank.h"
int main()
{
Mainframe* i7 = new i7Mainframe;
Mainframe* ahd = new AccessoriesHardDisk(i7);
Mainframe* amb = new AccessoriesMemoryBank(ahd);
cout << "产品:" << ahd->GetName() << "价格:" << ahd->GetPrice() << endl;
cout << "产品:" << amb->GetName() << "价格:" << amb->GetPrice() << endl;
Mainframe* al = new AccessoriesHardDisk(new AccessoriesMemoryBank(new i7Mainframe));
cout << "产品:" << al->GetName() << "价格:" << al->GetPrice() << endl;
delete amb;
delete al;
getchar();
return 0;
}
总结:
装饰者模式(Decorator):装饰者模式可以更加灵活的为一个类增加功能,但是也造成了大量的类,增加了排除错误的难度
作者:丶梦爱
博客:https://blog.csdn.net/u014732297(转载请说明出处)