首页 > 其他分享 >【设计模式】之桥接模式

【设计模式】之桥接模式

时间:2022-09-20 15:57:14浏览次数:38  
标签:桥接 void 模式 color 形状 Color Graphics 设计模式 public

桥接模式(Bridge Pattern)定义:将抽象化与实现化分离,使得双方可以独立变化。

当然好多人看到这定义头都大了,什么叫抽象化?什么又叫实现化?

还是举个例子吧。

假如说,有个图形(Graphics)接口,具有方法draw(),他有两个可以变化的维度,形状(Shape)和颜色(Color)。怎么实现呢?容易想到这样一种方式:先从Graphics类继承出矩形(Rectangle)、圆形(Circle)等形状子类,再给每个形状子类分别派生出红色矩形(RedRectangle)、绿色矩形(GreenRectangle)、红色圆形(RedCircle)和绿色圆形(GreenCircle)。

此时的类体系结构如下:

有什么问题?

不难发现,如果我们要新增加一个形状,例如三角形,我们就需要对应增加n个子类(其中n=颜色个数),来使三角形具有不同的颜色。同样,如果我们要增加一种颜色,例如黄色,那么就需要对应增加m个子类(其中m=形状个数),来使所有的形状都具有黄色这种颜色。

事实上,如果我们有m种形状,n种颜色,那么我们一共需要的类的个数为m*n。这也太可怕了吧!人是喜欢偷懒的动物,谁也不想为了区区几个形状和颜色写这么多个类。而且随着形状和颜色的增加,类的个数的增长速度也会越来越快,造成类爆炸。那有没有一种办法,可以让我们不需要写那么多类呢?答案当然是有的!试试看用组合替代继承会怎样?

咱们还是从Graphics类派生出各个形状子类,但不同的是,这次改用组合来使形状具有不同颜色,这时的类体系结构如下:

看,采用组合替代继承之后,当我们需要增加一种形状的时候,我们是不是只需要多写一个类了,不用为每个颜色对应增加一个形状类。同样,需要增加一种颜色的时候,也只需要写一个类,不用让每个形状都具有这种颜色。如果我们有m种形状,n种颜色,那么我们就只需要m+n个类就可以了,是不是比m*n要少的多了。

那上面的例子中,每个部分都扮演着什么样的角色呢?

抽象化(Abstraction):如例子中的Graphics类。
扩展抽象化(Refined Abstraction):由抽象化类派生而来,通过组合关系调用实现化类的相应方法,如例子中的RectangleCircle等类。
实现化(Implementation):如例子中的Color类。
具体实现化(Concrete Implementation):如例子中的RedGreen等类。

话不多说,直接上代码(假设已#include相应头文件并using namespace std;):

Graphics类:

class Graphics
{
protected:
    Color &color;
public:
    Graphics(Color &color) : color(color) { }

    virtual void draw() = 0;
}

Rectangle类:

class Rectangle : public Graphics
{
public:
    Rectangle(Color &color) : Graphics(color) { }

    void draw() override
    {
        color.paint("矩形");
    }
}

Circle类:

class Circle : public Graphics
{
public:
    Circle(Color &color) : Graphics(color) { }

    void draw() override
    {
        color.paint("圆形");
    }
}

Color类:

class Color
{
public:
    virtual void paint(string shape) = 0;
}

Red类:

class Red : public Color
{
public:
    void paint(string shape) override
    {
        cout << "绘制红色的" << shape << endl;
    }
}

Green类:

class Green : public Color
{
public:
    void paint(string shape) override
    {
        cout << "绘制绿色的" << shape << endl;
    }
}

main函数:

int main(int argc, char *argv[])
{
    Red red();
    Rectangle rectangle(red);
    rectangle.draw();
    return 0;
)

标签:桥接,void,模式,color,形状,Color,Graphics,设计模式,public
From: https://www.cnblogs.com/YWT-Real/p/16711072.html

相关文章

  • 我的设计模式之旅、14 模板方法模式
    编程旅途是漫长遥远的,在不同时刻有不同的感悟,本文会一直更新下去。思考总结思考问题多个类中包含许多相似代码,只是小部分代码不同。思考如何在保持算法结构完整的情况......
  • JS使用策略模式优化条件选择结构
    这段代码是采用if-else的方式判断多个不同的条件。functionpermission(role){if(role==="operations"){getOperationPermission()}elseif(role=......
  • 聊聊如何利用管道模式来进行业务编排(下篇)
    前言上篇文章我们介绍利用管道模式来进行业务编排的2种实现方式。本文又来介绍其他实现方式实现方式方式一:利用springboot自动装配1、新建管道实体@Data@AllArgsCo......
  • 【设计模式】Java设计模式 - 模板模式
    Java设计模式-模板模式......
  • 设计模式在业务系统中的应用
      本文的重点在于说明工作中所使用的设计模式,为了能够更好的理解设计模式,首先简单介绍一下业务场景。使用设计模式,可以简化代码、提高扩展性、可维护性和复用性。有哪......
  • Redis集群:Sentinel哨兵模式
    Redis集群:Sentinel哨兵模式(详细图解)(biancheng.net)在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切......
  • 设计模式---六大设计原则
    六大设计原则单一职责原则接口隔离原则开闭原则依赖倒置原则里氏代换原则迪米特法则单一职责原则我们分别看两个案例,一个是遵守单一职责原则,另一个是违背。违背......
  • Handler机制与生产者消费者模式
    本文梳理了Handler的源码,并详细阐述了Handler与生产者消费者模式的关系,最后给出了多版自定义Handler实现。本文首发于简书,重新整理发布。一、HandlerHandler在A......
  • C++软件设计模式
    模式:在某些场景下,针对某类问题的某种通用的解决方案。1.六大设计模式单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。开放封闭原则:软件实体可以扩展,但是不可......
  • 设计模式 -- Observer(观察者模式)
    在软件构建的过程中,我们需要为某些对象建立一种“通知依赖关系”——一个对象(目标对象)的状态发生改变,其他对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使得......