C++与设计模式(10)——桥接模式

桥接模式

定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化

这种说法可能不太好理解,那我们有另一种说法,桥接模式是将复杂变化的多个维度分开,通过组合的形式进行联系。

举个例子,现在我们要写一个绘图设备(类),它可以画不同颜色不同形状的图形:
苟
先想一个简单的实现,我们的设备拥有绘制所有这些图形的接口:
利
我们可以发现这么做的话我们的设备的接口会变得非常之多,难以维护和管理,接口内也会出现许多重复代码,增加编程负担,所以这里使用桥接模式。

按照桥接模式的两种说法,我们可以这样理解:
1. DrawDevice的绘制接口所做的事是用‘颜色’绘制‘形状’,那么将‘颜色’‘形状’这两个抽象部分独立出来。
2. 我们的绘制结果是是由‘颜色’‘形状’这两个维度决定的,那么把这两个维度分离,让其单独进行变化。

可以看出来虽然说法不同但表达的含义是相同的,那么我们独立出‘颜色’‘形状’的概念,而设备只提供一个接口。
桥接模式的实现:

//形状类
class Shape
{
public:
    virtual void readShape(){};
};

class Triangle : public Shape
{
public:
    void readShape()
    {
        cout << "Triangle";
    }
};

class Square : public Shape
{
public:
    void readShape()
    {
        cout << "Square";
    }
};

class Circular : public Shape
{
public:
    void readShape()
    {
        cout << "Circular";
    }
};

//颜色类
class Color
{
public:
    virtual void readColor(){};
};

class Red : public Color
{
public:
    void readColor()
    {
        cout << "Red ";
    }
};

class Yellow : public Color
{
public:
    void readColor()
    {
        cout << "Yellow ";
    }
};

class Blue : public Color
{
public:
    void readColor()
    {
        cout << "Blue ";
    }
};

class DrawDevice
{
public:
    void draw(Color *color,Shape *shape)
    {
        cout << "draw ";
        color->readColor();
        shape->readShape();
    }
};

int main()
{
    DrawDevice device;

    Shape *shape = new Triangle;
    Color *color = new Red;
    device.draw(color,shape);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
桥接模式是一种结构型设计模式,它将抽象和实现分离,使它们可以独立地变化。桥接模式的核心思想是将一个大类或一组类分解成抽象和实现两个独立的维度,使它们可以独立地变化和扩展,同时通过桥接来将它们连接起来。 在C++中,桥接模式通常通过虚函数实现。抽象部分通过基类定义接口,而实现部分通过派生类实现具体的功能。通过将抽象部分的指针作为参数传递给实现部分的函数,就可以实现两个部分的连接。 下面是一个简单的桥接模式C++示例: ```c++ class Implementor { public: virtual void operation() = 0; virtual ~Implementor() {} }; class ConcreteImplementorA : public Implementor { public: void operation() override { // 具体的实现A } }; class ConcreteImplementorB : public Implementor { public: void operation() override { // 具体的实现B } }; class Abstraction { public: Abstraction(Implementor* implementor) : m_implementor(implementor) {} virtual void operation() = 0; virtual ~Abstraction() {} protected: Implementor* m_implementor; }; class RefinedAbstraction : public Abstraction { public: RefinedAbstraction(Implementor* implementor) : Abstraction(implementor) {} void operation() override { m_implementor->operation(); // 其他操作 } }; int main() { Implementor* implementorA = new ConcreteImplementorA(); Implementor* implementorB = new ConcreteImplementorB(); Abstraction* abstractionA = new RefinedAbstraction(implementorA); Abstraction* abstractionB = new RefinedAbstraction(implementorB); abstractionA->operation(); abstractionB->operation(); delete abstractionA; delete abstractionB; delete implementorA; delete implementorB; return 0; } ``` 在上面的示例中,Implementor是实现部分的抽象基类,ConcreteImplementorA和ConcreteImplementorB是具体的实现类。Abstraction是抽象部分的基类,RefinedAbstraction是抽象部分的具体实现类。在main函数中,我们创建了不同的Implementor和Abstraction对象,并通过它们来完成不同的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值