一年又一年,元宵节到了,看看电视,吃吃汤圆,听听远处阵阵传来鞭炮声,给“年”说拜拜了。。。
言归正传,大家一起学习装饰模式,从字面意思来说,就是装饰一个对象,给一个对象扩展一新的功能或者职责。比如说我们现在要装修一个房子,我们要先铺地板,铺水管,装灯等等,但总有一些事情我们想不到。在遵守“开放-封闭”原则下,可以通过继承子类,扩展父类功能,也可以通过装饰模式,更方便的扩展对象的功能。接下里来实现这个装修房子的类,具体代码如下:
//抽象类
#ifndef _COMPONET_H
#define _COMPONET_H
class Component
{
public:
virtual ~Component()
{
}
virtual void Operation() = 0;
protected:
Component()
{
}
};
#endif
//装修房子类---头文件
#pragma once
#include "Componet.h"
class CHouseComponent :
public Component
{
public:
CHouseComponent();
~CHouseComponent();
virtual void Operation();
};
//装修房子类---cpp
#include "housecomponent.h"
#include <iostream>
using namespace std;
CHouseComponent::CHouseComponent()
{
}
CHouseComponent::~CHouseComponent()
{
}
void CHouseComponent::Operation()
{
cout << "装修房子了..." << endl;
cout << "铺电线..." << endl;
cout << "铺水管..." << endl;
}
//装饰基类---头文件
#pragma once
#include "Componet.h"
class CDecorator :
public Component
{
public:
~CDecorator();
virtual void Operation();
void setComponent(Component* component);
protected:
CDecorator();
protected:
Component* mpComponent;
};
//装饰基类---cpp
#include "decorator.h"
CDecorator::CDecorator()
{
mpComponent = nullptr;
}
CDecorator::~CDecorator()
{
}
void CDecorator::Operation()
{
if (mpComponent != nullptr)
{
mpComponent->Operation();
}
}
void CDecorator::setComponent(Component* component)
{
mpComponent = component;
}
//地板装饰类--头文件
#pragma once
#include "decorator.h"
class CFloorDecorator :
public CDecorator
{
public:
CFloorDecorator();
~CFloorDecorator();
virtual void Operation();
};
//地板装饰类--头文件
#include "floordecorator.h"
#include <iostream>
using namespace std;
CFloorDecorator::CFloorDecorator()
{
}
CFloorDecorator::~CFloorDecorator()
{
}
void CFloorDecorator::Operation()
{
CDecorator::Operation();
cout << "铺地板..." << endl;
}
//调用
#include <iostream>
using namespace std;
#include "housecomponent.h"
#include "floordecorator.h"
void main()
{
CHouseComponent* pHouseComponent = new CHouseComponent();
CFloorDecorator* pFloorDecorator = new CFloorDecorator();
pFloorDecorator->setComponent(pHouseComponent);
pFloorDecorator->Operation();
cin.get();
}