C++设计模式 07 桥模式

  1. 桥模式和之前的装饰模式类似,都是采用 运行时识别的技巧,对代码进行重构和精简。本次案例的上课视频来自极客班,需要辅助视频看本文才可以。
    在这里插入图片描述

  2. 本次待解决的问题如下:如果我们想做一个可以发送信息的软件,但是该软件会在不同的平台发布,如window电脑端,mac电脑端,以及Mobile手机端等等,针对不同平台,同样的操作需要不同的代码,如同样是发送信息,但是不同的平台的实现肯定是不一样的。假设我们有n个平台,且每个平台上我们要实现软件的不同版本,如精简版和全能版两种,以m为代替,这样我们解决该问题的传统方法为:其中从上到下为依次继承关系,这样我们一共需要写1+2+22=7个类,这个数字可能看起来小,这是因为情况简单。如果版本数m增大,如为20,则需要新建的类为:1+2+220=43个
    请添加图片描述

  3. 改进该方法,让新建类的数目满足2+n+m的格式,即当n=2,m=20时,新建类的数量只需要2+2+20=24个即可
    请添加图片描述

  4. 代码如下:注意这里将所有.h和.cpp文件放在一起了

main.cpp
//main.cpp
#include "IMP.h"
#include <iostream>
using namespace std;
int main() {
	/*
	PC 端+ 全能版
	*/
	messageImp * mp = new PCBase();	
	message *m1 = new perfect(mp);
	m1->login();
	m1->sendMessage();
	m1->sendPicture();


	cout <<endl<< endl;
	/*
		移动端+精简版
	*/
	messageImp *mp2 = new mobileBase();
	message *m2 = new lite(mp2);
	m2->login();
	m2->sendMessage();
	m2->sendPicture();

	cout << endl;
	delete mp2;
	delete m2;
	delete mp;
	delete m1;
	cout << endl;
	return 0;
}
message.h &message.cpp
//message.h
#pragma once
#include "messageImp.h"
class messageImp;
class message
{
protected:
	messageImp * mp;
public:
	message(messageImp *m);
	virtual void login() = 0;
	virtual void sendMessage() = 0;
	virtual void sendPicture() = 0;
	virtual ~message();
};

//message.cpp
#include "message.h"
#include <iostream>
using namespace std;
message::message(messageImp *m)
{
	mp = m;
}

message::~message() { }
messageImp.h &messageImp.cpp
//messageImp.h
#pragma once
class messageImp
{
public:
	messageImp();
	virtual void playSound() = 0;
	virtual void drawShape() = 0;
	virtual void writeText() = 0;
	virtual void connect() = 0;
	virtual ~messageImp();
};

//messageImp.cpp
#include "messageImp.h"
#include <iostream>

using namespace std;
messageImp::messageImp() {};
messageImp::~messageImp() {  };
base.h & base.cpp
//base.h
#pragma once
#include "messageImp.h"
class PCBase:public messageImp
{
public:
	PCBase();
	virtual void playSound();
	virtual void drawShape();
	virtual void writeText();
	virtual void connect();
	~PCBase();
};

class mobileBase:public messageImp
{
public:
	mobileBase();
	virtual void playSound();
	virtual void drawShape();
	virtual void writeText();
	virtual void connect();
	~mobileBase();

private:
};

//base.cpp
#include "Base.h"
using namespace std;
#include <iostream>
PCBase::PCBase()
{
}
void PCBase::playSound() {
	cout << "PCBase: playSound" << endl;
}
void PCBase::drawShape() {
	cout << "PCBase: drawShape" << endl;
}
void PCBase::writeText() {
	cout << "PCBase: writeText" << endl;
}

void PCBase::connect() {
	cout << "PCBase: connect" << endl;
}

PCBase::~PCBase()
{
}

mobileBase::mobileBase()
{
}
void mobileBase::playSound() {
	cout << "mobileBase: playSound" << endl;
}
void mobileBase::drawShape() {
	cout << "mobileBase: drawShape" << endl;
}
void mobileBase::writeText() {
	cout << "mobileBase: writeText" << endl;
}

void mobileBase::connect() {
	cout << "mobileBase: connect" << endl;
}
mobileBase::~mobileBase()
{
}
IMP.h & IMP.cpp(具体的实现(implementation))
//IMP.h
#pragma once
#include "message.h"
#include "Base.h"
class lite:public message
{
public:
	lite(messageImp* p);
	virtual void login();
	virtual void sendMessage();
	virtual void sendPicture();
	~lite();
};

class perfect:public message
{
public:
	perfect(messageImp* p);
	virtual void login();
	virtual void sendMessage();
	virtual void sendPicture();
	~perfect();

private:

};
//IMP.cpp
#include "IMP.h"
#include <iostream>
using namespace std;


lite::lite(messageImp* p):message(p) {
	
}
void lite::login() {
	cout << endl << "Lite login" << endl;
	this->mp->connect();
}
void lite::sendMessage()
{
	cout << endl << "Lite sendMessage" << endl;
	this->mp->drawShape();
}
void lite::sendPicture() {
	cout << endl << "Lite sendPicture" << endl;
	this->mp->writeText();
}

lite::~lite()
{
}

perfect::perfect(messageImp* p):message(p)
{
}
void perfect::login() {
	cout <<endl<< "Perfect login" << endl;
	this->mp->playSound();
	this->mp->connect();
}
void perfect::sendMessage()
{
	cout << endl << "Perfect sendMessage" << endl;
	this->mp->playSound();
	this->mp->drawShape();
}
void perfect::sendPicture() {
	cout << endl << "Perfect sendPicture" << endl;
	this->mp->playSound();
	this->mp->writeText();
}
perfect::~perfect()
{
}
运行结果如下:

在这里插入图片描述

  1. 本次代码中遇到的问题:
  • 基类的析构函数必须设为虚函数(不是纯虚)
  • 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,如
class father{
public:
int age;
father(int a){age=a;}
virtual father();
};

class son:public father{
son(int a):father(a){}
~son();
};
  • 类的构造和析构函数的实现不要放在.h文件中,放在.cpp文件中。也许把基类的实现和定义都放在.h文件中理论上是可以的,但是实际操作中会报错。
  1. 附上本次视频算法的笔记,供以后查阅请添加图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值