前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >结构型之桥接模式C++实现

结构型之桥接模式C++实现

作者头像
用户9831583
发布2022-06-16 15:11:55
1710
发布2022-06-16 15:11:55
举报
文章被收录于专栏:码出名企路

需求分析:图形既可按形状分,又可按颜色分。如何能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等

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

优点:

  • 由于抽象与实现分离,所以扩展能力强;
  • 其实现细节对客户透明。

缺点:

由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。

主要角色:

  1. 抽象化角色:定义抽象类,并包含一个对实现化对象的引用。
  2. 扩展抽象化角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  3. 抽象实现化角色:定义实现化角色的接口,供扩展抽象化角色调用。
  4. 具体实现化角色:给出实现化角色接口的具体实现。

具体案例:

继承变为组合:

第一步:抽象化角色

代码语言:javascript
复制
#pragma once
#include <cstring>
#include <iostream>
using namespace std;

class Color;
//抽象类
//形状类
class Shape
{
    public:
        virtual void draw()=0;
        void setColor(Color *color)
        {
            this->color=color;
        }
    public:
        Color *color;
};

第二步:扩充抽象化角色

代码语言:javascript
复制
//扩充抽象类
//三个形状
class Circle:public Shape
{
    public:
        void draw()
        {
            color->paint("圆形");
        }
};

class Rec:public Shape
{
    public:
        void draw()
        {
            color->paint("长方形");
        }
};

class Squ:public Shape
{
    public:
        void draw()
        {
            color->paint("正方形");
        }
};

第三步:抽象实现化角色

代码语言:javascript
复制
//颜色类
class Color
{
    public:
        virtual void paint(string shape)=0;
};

第四步:具体实现化角色

代码语言:javascript
复制
//颜色接口的实现
//白色
class White:public Color
{
    public:
        void paint(string shape)
        {
            cout<<"白色的"<<shape<<endl;
        }
};

class Gray:public Color
{
    public:
        void paint(string shape)
        {
            cout<<"灰色的"<<shape<<endl;
        }
};

class Black:public Color
{
    public:
        void paint(string shape)
        {
            cout<<"黑色的"<<shape<<endl;
        }
};

第五步:主函数

代码语言:javascript
复制
#include "s.h"

int main()
{
    //虚基类实例化子类
    Color *white=new White();
    Shape *squ=new Squ();
    //组合
    squ->setColor(white);
    squ->draw();

    //长方形
    Shape *rec=new Rec();
    rec->setColor(white);
    rec->draw();

    return 0;
}

结果显示:


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码出名企路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档