桥接模式 结构型模式之二

1.定义

        将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

2.应用场景

        比如这样一个项目:我们的目的是实例化一个带颜色的图形。其中图形包括:圆、正方形、三角形;颜色包括:红色、绿色和黄色。如果使用继承关系设计这个项目的类,我们可能需要:红色圆类,红色正方形类,红色三角形类;绿色圆类,绿色正方形类,绿色三角形类;黄色圆类,黄色正方形类,黄色三角形类。m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。

        如果使用桥接模式,我们只需要定义3个具体形状类:圆形、正方形、三角形;和3个具体颜色类:红色、绿色和黄色。这种处理方法看起来和装饰器模式有些类似(装饰器模式可以看笔者的另一篇文章),区别是这里面列举的颜色,并不是作为形状的装饰(或者是扩展部件),而是作为实例化带颜色的图形的必要部分,注意是必要部分如果我们要完成实例化,就必须要明确形状+颜色,二者缺一不可。在下面的代码实现中也可以看到这一点。

3.示例代码

#include <string>
#include <vector>
#include <iostream>

using namespace std;

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

//红色类
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;
    }
};

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

private:
    Color* _color;
};

//圆
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("三角形");
    }
};

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

    system("pause");
    return 0;
}

4.引用

https://blog.youkuaiyun.com/ymhdt/article/details/124340672

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值