需求分析:图形既可按形状分,又可按颜色分。如何能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等
桥接模式:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
优点:
缺点:
由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
主要角色:
具体案例:
继承变为组合:
第一步:抽象化角色
#pragma once
#include <cstring>
#include <iostream>
using namespace std;
class Color;
//抽象类
//形状类
class Shape
{
public:
virtual void draw()=0;
void setColor(Color *color)
{
this->color=color;
}
public:
Color *color;
};
第二步:扩充抽象化角色
//扩充抽象类
//三个形状
class Circle:public Shape
{
public:
void draw()
{
color->paint("圆形");
}
};
class Rec:public Shape
{
public:
void draw()
{
color->paint("长方形");
}
};
class Squ:public Shape
{
public:
void draw()
{
color->paint("正方形");
}
};
第三步:抽象实现化角色
//颜色类
class Color
{
public:
virtual void paint(string shape)=0;
};
第四步:具体实现化角色
//颜色接口的实现
//白色
class White:public Color
{
public:
void paint(string shape)
{
cout<<"白色的"<<shape<<endl;
}
};
class Gray:public Color
{
public:
void paint(string shape)
{
cout<<"灰色的"<<shape<<endl;
}
};
class Black:public Color
{
public:
void paint(string shape)
{
cout<<"黑色的"<<shape<<endl;
}
};
第五步:主函数
#include "s.h"
int main()
{
//虚基类实例化子类
Color *white=new White();
Shape *squ=new Squ();
//组合
squ->setColor(white);
squ->draw();
//长方形
Shape *rec=new Rec();
rec->setColor(white);
rec->draw();
return 0;
}
结果显示: