桥接模式

模式简介

桥接模式适用于系统有2个或者以上变化维度的情景,这种模式可以显示地降低类的个数,同时用户可以根据需求进行灵活地组合。

举个例子,假设我们有M个抽象类A的子类,有N个抽象类B的子类,A类族需要使用B类族的方法。如果是直接进行继承操作,即实现一个C类族,使得C类族同时继承自A、B族,那么需要 O ( M N ) O(MN) O(MN)级别的类个数,这样会造成系统过于膨胀。如果使用组合的方式,A类族内部包含一个B族基类的指针,这样A的子类可以根据需要来组合B的子类,此时需要 O ( M + N ) O(M+N) O(M+N)个方式,可以有效减少类的数量。

模式实现

class A {
public:
	virtual void methodA() = 0;  // A族的方法
};

class B {
public:
	virtual void methodB() = 0; // B的方法,这里面需要A族的方法
	virtual void setA(std::shared_ptr<A> p) {  // 组合方法
		m_spA = std::move(p);
	}
private:
	std::shared_ptr<A> m_spA;
};

UML类图

在这里插入图片描述

代码实例

假设我们有smallbig两种画笔,每个画笔有多个颜色,现在需要不同的笔搭配不同的颜色,设计这样一个系统。

#include <iostream>
#include <memory>

class Color {  // 抽象的颜色
public:
    virtual void drawColor() = 0;  // 颜色的方法
};

class Red : public Color {
public:
    void drawColor() override {
        std::cout << "Red!\n";
    }
};

class Green : public Color {
public:
    void drawColor() override {
        std::cout << "Green!\n";
    }
};

class Blue : public Color {
public:
    void drawColor() override {
        std::cout << "Blue!\n";
    }
};

class Pen {  // 抽象的笔
public:
    virtual void paint() = 0;  // 笔的抽象方法
};

class SmallPen : public Pen {
public:
    void paint() override {
        std::cout << "Small Pen: ";
        m_spColor->drawColor();
    }

    void setColor(std::shared_ptr<Color> color) {
        m_spColor = std::move(color);
    }

private:
    std::shared_ptr<Color> m_spColor;
};

class BigPen : public Pen {
public:
    void paint() override {
        std::cout << "Big Pen: ";
        m_spColor->drawColor();
    }

    void setColor(std::shared_ptr<Color> color) {
        m_spColor = std::move(color);
    }

private:
    std::shared_ptr<Color> m_spColor;
};


int main() {
    SmallPen smallPen;
    BigPen bigPen;

    smallPen.setColor(std::make_shared<Red>());
    smallPen.paint();

    bigPen.setColor(std::make_shared<Green>());
    bigPen.paint();

    bigPen.setColor(std::make_shared<Blue>());
    bigPen.paint();

    return 0;
}

输出结果:

Small Pen: Red!
Big Pen: Green!
Big Pen: Blue!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值