设计模式-桥接模式 C++

本文介绍了桥接模式,一种用于解耦抽象化与实现化的结构型设计模式。通过实例展示了如何使用桥接模式设计一个带有颜色的图形系统,避免了大量重复的类组合。在代码实现中,创建了颜色和形状的抽象基类及具体实现,实现了颜色和形状的独立变化,简化了类的结构。
摘要由CSDN通过智能技术生成

一、简介

1、什么是桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。需要注意的是,这里面说的抽象化和实现化并不是指抽象基类和具体派生类的关系。即桥接模式的目的并不是把抽象基类和具体派生类进行分离。而是指把问题的具体特质分离出来,以关联的关系加入对象的实例化过程。可以结合下面的桥接模式实例理解。

二、桥接模式实例

【项目实例】

比如这样一个项目:我们的目的是实例化一个带颜色的图形。其中

图形包括:圆、正方形、三角形;

颜色包括:红色、绿色和黄色。

【解析】

如果使用继承关系设计这个项目的类,我们可能需要:红色圆类,红色正方形类,红色三角形类;绿色圆类,绿色正方形类,绿色三角形类;黄色圆类,黄色正方形类,黄色三角形类。

但如果使用桥接模式,我们只需要定义3个具体形状类:圆形、正方形、三角形;和3个具体颜色类:红色、绿色和黄色。

这种处理方法看起来和装饰器模式有些类似(装饰器模式见下列链接),区别是这里面列举的颜色,并不是作为形状的装饰(或者是扩展部件),而是作为实例化带颜色的图形的必要部分。如果我们要完成实例化,就必须要明确形状+颜色,二者缺一不可。在下面的代码实现中也可以看到这一点。

设计模式-装饰器模式 C++_星星典典的博客-CSDN博客一、简介1、什么是装饰器模式装饰器模式是结构型设计模式。装饰器是现有类的一个包装,可以在不修改现有类且不增加子类的情况下扩展现有类。【注】可以实现向一个现有对象添加新的功能,同时又不改变其结构的设计模式,称为结构型模式。2、为什么使用装饰器模式装饰器模式用于需要对现有类进行扩展的场景。一般情况下,我们想要扩展现有类还可以声明它的子类,即使用继承的特性达到目的。但是如果我们经常使用增加子类的方法扩展现有类,会造成子类的臃肿膨胀。...https://blog.csdn.net/ymhdt/article/details/124301943

【类的组成】

此项目,我们使用桥接模式需要定义的类有:

1)颜色抽象基类Color;

2)具体颜色类-红色Red;

     具体颜色类-绿色Green;

     具体颜色类-黄色Yellow;

3)形状抽象基类Shape,同时作为桥接类,传入Color对象的指针,实现调用某颜色画图的方法;

4)形状具体类-圆Circle;

     形状具体类-正方形Square;

     形状具体类-三角形Triangle;

【代码实现】

1)颜色抽象基类Color

//颜色抽象类
class Color
{
public:
    virtual ~Color() {};
    virtual void DoPaint(string shape) = 0;
};

2)具体颜色类,实现使用本类颜色画出传入的图形的方法DoPaint

//红色类
class Red : public Color
{
    virtual void DoPaint(string shape)
    {
        cout << "画图:红色的" << shape.c_str() << endl;
    }
};

//绿色类
class Green : public Color
{
    virtual void DoPaint(string shape)
    {
        cout << "画图:绿色的" << shape.c_str() << endl;
    }
};

//黄色类
class Yellow : public Color
{
    virtual void DoPaint(string shape)
    {
        cout << "画图:黄色的" << shape.c_str() << endl;
    }
};

3)形状抽象基类Shape。同时作为桥接类,桥接的理解:保存了Color的指针,提供实现使用传入的颜色传入的形状进行画图的关键方法draw(string shape)

//形状-桥接类
class Shape
{
public:
    Shape(Color* color) : _color(color) {}
    virtual ~Shape() {}
    virtual void draw() = 0;
    void draw(string shape)
    {
        _color->DoPaint(shape);
    }

private:
    Color* _color;
};

4)形状具体类

//圆
class Circle : public Shape
{
public:
    Circle(Color* color) : Shape(color) {}
    virtual void draw()
    {
        Shape::draw("圆");
    }

};
//正方形
class Square : public Shape
{
public:
    Square(Color* color) : Shape(color) {}
    virtual void draw()
    {
        Shape::draw("正方形");
    }
};
//三角形
class Triangle : public Shape
{
public:
    Triangle(Color* color) : Shape(color) {}
    virtual void draw()
    {
        Shape::draw("三角形");
    }
};

5)根据需求,实例化“绿色的三角形”对象,完成画图

int main()
{
    Shape* sh = new Triangle(new Green());
    sh->draw();

    system("pause");
    return 0;
}

如果本篇文章对您有所帮助,请点赞关注支持一下。 十分感谢!也欢迎评论留言,感谢对文章的批评讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值