桥模式也是一个非常巧妙的关系,https://www.cnblogs.com/xiaobingqianrui/p/9013692.html这篇文章讲的比较好。
他把a*b的关系变成了a+b,有效的简化了类的数量,使用类的组合而不是继承来优化代码。
下面的代码中,我举了一个不同颜色画笔的例子来解释,还是非常好懂的
/*
b.hpp
*/
#include<string>
#include<iostream>
class Color{
public:
std::string color_name;
Color(std::string cn):color_name(cn){}
virtual ~Color(){}
virtual void getColor() //获得颜料,其实因为color_name初始化了,就可以直接返回
{
std::cout<<color_name;
}
};
class Pen{
public:
std::string pen_name;
Pen(std::string pn):pen_name(pn){}
virtual ~Pen(){}
virtual void draw(Color* color)=0; //开始下笔
};
/*
main.cpp
bridge 桥模式
定义:
简化多个维度的变化
考虑一个例子:
我需要5种颜色的 粗,中,细 的画笔。
如果单独继承,就需要 3*5个类,太冗余
不过如果设计成Bridge模式,只需要3+5种类,用户便可以自己自由组合
*/
#include<iostream>
#include"b.hpp"
using namespace std;
/*
我们先设计不同粗细的画笔
*/
class SlimPen : public Pen{ //细的笔
public:
SlimPen():Pen("细笔"){}
virtual void draw(Color* color){
color->getColor();
cout<<this->pen_name<<endl;
}
};
class MiddlePen : public Pen{ //中的笔
public:
MiddlePen():Pen("中笔"){}
virtual void draw(Color* color){
color->getColor();
cout<<this->pen_name<<endl;
}
};
class ThickPen : public Pen{ //粗的笔
public:
ThickPen():Pen("粗笔"){}
virtual void draw(Color* color){
color->getColor();
cout<<this->pen_name<<endl;
}
};
/*然后设计不同的颜色*/
class Red:public Color{
public:
Red():Color("红色的"){}
};
class Yellow:public Color{
public:
Yellow():Color("黄色的"){}
};
class Blue:public Color{
public:
Blue():Color("蓝色的"){}
};
int main(){
//现在,我们就可以用3+5个类,创造出3*5个画笔了!
Blue blue;Red red;Yellow yellow;
SlimPen sp1; //初始化细笔
//愉快的蘸取不同颜色
sp1.draw(&blue);
sp1.draw(&red);
sp1.draw(&yellow);
return 0;
}