设计模式-装饰模式之重新理解

本文深入探讨了装饰模式在软件设计中的应用,通过实例讲解了如何动态地为对象添加新的功能,而不改变其原有结构。装饰模式遵循多用组合少用继承的原则,通过继承实现对对象的扩展,使对象能够在运行时增加额外的责任。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰模式:动态地将责任或者功能添加到对象上,是对象又增加了除去本身外的其他功能。

在设计过程中,大家都知道一些基本的原则,比如多用组合少用继承。但是装饰模式就是使用到的继承。装饰者和被装饰的对象必须是一样的类型,也就是有共同的基类。这是关键的地方,装饰者是对被装饰者的扩展装饰而来的,装饰者本身和被装饰者属于同一种类型,它们具有相同的接口,装饰者能够替代被装饰者。

示例:
定义飞机类

#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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值