-
桥模式和之前的装饰模式类似,都是采用 运行时识别的技巧,对代码进行重构和精简。本次案例的上课视频来自极客班,需要辅助视频看本文才可以。
-
本次待解决的问题如下:如果我们想做一个可以发送信息的软件,但是该软件会在不同的平台发布,如window电脑端,mac电脑端,以及Mobile手机端等等,针对不同平台,同样的操作需要不同的代码,如同样是发送信息,但是不同的平台的实现肯定是不一样的。假设我们有n个平台,且每个平台上我们要实现软件的不同版本,如精简版和全能版两种,以m为代替,这样我们解决该问题的传统方法为:其中从上到下为依次继承关系,这样我们一共需要写1+2+22=7个类,这个数字可能看起来小,这是因为情况简单。如果版本数m增大,如为20,则需要新建的类为:1+2+220=43个
-
改进该方法,让新建类的数目满足2+n+m的格式,即当n=2,m=20时,新建类的数量只需要2+2+20=24个即可
-
代码如下:注意这里将所有.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()
{
}
运行结果如下:
- 本次代码中遇到的问题:
- 基类的析构函数必须设为虚函数(不是纯虚)
- 如果子类调用父类带参数的构造方法,需要用初始化父类成员对象的方式,如
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文件中理论上是可以的,但是实际操作中会报错。
- 附上本次视频算法的笔记,供以后查阅