考虑这样一个问题:
需要获得一个图形,这个图形可以是圆形,可以是正方形,可以使长方形其颜色可以是蓝色可以是红色可以是绿色,如果这种情况下将设计写死,那么可以
看到有3*3=9 个类,但是图形和颜色更多呢?那么成为一个基本不能完成的任务,那么在这种情况下我们就需一种叫做桥接的设计模式,它的原理同样是
通过虚函数进行解耦合,实现方式 图形抽象类通过一个输入颜色抽象类的指针(依赖)来代表颜色,然后通过保存在一个聚合的颜色抽象类指针成员中,这里
通过这两图形抽象类和颜色抽象类进行解耦合,同时能够实现任何颜色和任何图形之间的组合,也是非常神奇的一种设计模式
下面是模式图:
下面是上面问题的代码实现:
输出为:
I'm bule rectangle
I'm red rectangle
I'm green square
I'm bule square
代码:
点击(此处)折叠或打开
-
#include<iostream>
-
using namespace std;
-
-
//颜色虚接口
-
class colour
-
{
-
public:
-
virtual void getcol() = 0;
-
virtual ~colour(){};
-
};
-
-
//形状虚接口
-
class graph
-
{
-
public:
-
virtual void setcol(colour* col) = 0; //依赖 桥接
-
virtual ~graph(){};
-
protected:
-
colour* col; //聚合 桥接
-
};
-
-
//颜色具体实现
-
class red:public colour
-
{
-
public:
-
virtual void getcol()
-
{
-
cout<<"I'm red ";
-
}
-
virtual ~red(){};
-
};
-
-
-
class bule:public colour
-
{
-
public:
-
virtual void getcol()
-
{
-
cout<<"I'm bule";
-
}
-
virtual ~bule(){};
-
};
-
-
class green:public colour
-
{
-
public:
-
virtual void getcol()
-
{
-
cout<<"I'm green ";
-
}
-
virtual ~green(){};
-
};
-
-
//形状具体实现并且桥接到颜色
-
-
class square:public graph
-
{
-
public:
-
square()
-
{
-
this->col = NULL ;
-
}
-
-
virtual void setcol(colour* col)
-
{
-
this->col = col;
-
}
-
void print()
-
{
-
this->col->getcol();
-
cout<<" square\n";
-
}
-
virtual ~square(){};
-
};
-
-
-
class triangle:public graph
-
{
-
public:
-
triangle()
-
{
-
this->col = NULL ; ;
-
}
-
virtual void setcol(colour* col)
-
{
-
this->col = col;
-
}
-
void print()
-
{
-
this->col->getcol();
-
cout<<" triangle\n";
-
}
-
virtual ~triangle(){};
-
};
-
-
class rectangle:public graph
-
{
-
public:
-
rectangle()
-
{
-
this->col = NULL ;
-
}
-
virtual void setcol(colour* col)
-
{
-
this->col = col;
-
}
-
void print()
-
{
-
this->col->getcol();
-
cout<<" rectangle\n";
-
}
-
virtual ~rectangle(){};
-
};
-
-
-
int main(void)
-
{
-
bule tblue;
-
red tred;
-
green tgreen;
-
-
rectangle trectangle;
-
trectangle.setcol(&tblue); //任意组合
-
trectangle.print();
-
trectangle.setcol(&tred); //任意组合
-
trectangle.print();
-
-
square tsquare;
-
tsquare.setcol(&tgreen); //任意组合
-
tsquare.print();
-
tsquare.setcol(&tblue); //任意组合
-
tsquare.print();
- }
作者微信: