装饰模式:动态地将责任或者功能添加到对象上,是对象又增加了除去本身外的其他功能。
在设计过程中,大家都知道一些基本的原则,比如多用组合少用继承。但是装饰模式就是使用到的继承。装饰者和被装饰的对象必须是一样的类型,也就是有共同的基类。这是关键的地方,装饰者是对被装饰者的扩展装饰而来的,装饰者本身和被装饰者属于同一种类型,它们具有相同的接口,装饰者能够替代被装饰者。
示例:
定义飞机类
#pragma once
//飞机基类
class AirPlane {
public:
AirPlane();
~AirPlane();
virtual void fly();
};
#include "AirPlane.h"
#include <stdio.h>
AirPlane::AirPlane() {
}
AirPlane::~AirPlane() {
}
void AirPlane::fly() {
printf("飞机在飞!!!\n");
}
#pragma once
#include "AirPlane.h"
//带有绘图的飞机
class DrawPalne :public AirPlane {
public:
DrawPalne(AirPlane* airPlane);
~DrawPalne();
virtual void fly()override;
private:
AirPlane* _airPlane = nullptr;
};
#include "DrawPalne.h"
#include <stdio.h>
DrawPalne::DrawPalne(AirPlane* airPlane) {
_airPlane = airPlane;
}
DrawPalne::~DrawPalne() {
}
void DrawPalne::fly() {
printf("带有绘图的");
_airPlane->fly();
}
#pragma once
#include "AirPlane.h"
//带有导弹的飞机
class MissilePlane :public AirPlane {
public:
MissilePlane(AirPlane* airPlane);
~MissilePlane();
virtual void fly()override;
private:
AirPlane* _airPlane = nullptr;
};
#include "MissilePlane.h"
#include <stdio.h>
MissilePlane::MissilePlane(AirPlane* airPlane) {
_airPlane = airPlane;
}
MissilePlane::~MissilePlane() {
}
void MissilePlane::fly() {
printf("带有导弹的");
_airPlane->fly();
}
#pragma once
#include "AirPlane.h"
//带有雷达的飞机
class RaddarPlane :public AirPlane {
public:
RaddarPlane(AirPlane* airPlane);
~RaddarPlane();
virtual void fly()override;
private:
AirPlane* _airPlane = nullptr;
};
#include "RaddarPlane.h"
#include <stdio.h>
RaddarPlane::RaddarPlane(AirPlane* airPlane) {
_airPlane = airPlane;
}
RaddarPlane::~RaddarPlane() {
}
void RaddarPlane::fly() {
printf("带有雷达的");
_airPlane->fly();
}
使用过程:
#include <stdio.h>
#include "AirPlane.h"
#include "DrawPalne.h"
#include "RaddarPlane.h"
#include "MissilePlane.h"
int main() {
AirPlane* plane = new AirPlane;
plane->fly();
//装饰上可以绘图的飞机
plane = new DrawPalne(plane);
plane->fly();
//装饰上可以带导弹的飞机
plane = new MissilePlane(plane);
plane->fly();
//装饰上可以带雷达的飞机
plane = new RaddarPlane(plane);
plane->fly();
return 0;
}
运行结果:
aaa