设计模式之Bridge模式的C++实现

这篇具有很好参考价值的文章主要介绍了设计模式之Bridge模式的C++实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、Bridge模式的提出

2、Bridge模式的定义

3、Bridge模式总结

4、需求描述

5、多继承方式实现

6、使用Bridge设计模式实现


1、Bridge模式的提出

        在软件功能模块设计中,如果类的实现功能划分不清晰,使得继承得到的子类往往是随着需求的变化,子类急剧膨胀,充斥重复代码。将类要实现功能划分清楚是设计较好软件框架的关键。

2、Bridge模式的定义

        对于类的实现功能具有两个变化的维度,甚至由多个维度的变化,使用类的多继承实现方式,会使子类数目急剧膨胀。Bridge模式使用“对象间的组合关系”解耦抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度变化,即将不同的维度分别进行抽象,然后各自根据变化维度进行继承。

3、Bridge模式总结

        Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类甚至有多个变化的维度,这时使用Bridge模式的扩展模式来设计代码。

4、需求描述

手机有固有属性(材料、颜色、摄像头个数)和软件属性(开机动画、网络打印、支持app数目)。有2款A、B类型手机,A、B分别继承手机的固有属性功能。在A款基础上又有2款Higher、Pro类型,Higher、Pro分别继承手机的软件功能;在B款的基础上也有2种Higher、Pro,这2种也分别继承手机的软件功能。

5、多继承方式实现

#include <iostream>


class MobilePhone
{
public:
    //手机材质
    virtual void PhoneMaterial()=0;
    //手机颜色
    virtual void PhoneColor()=0;
    //手机大小
    virtual void PhoneCameNum()=0;

    //开机动画
    virtual void BootAnimation()=0;
    //网络打印类型
    virtual void NetPrintType()=0;
    //软件支持数目
    virtual void SoftSuppotNum()=0;

    virtual ~MobilePhone(){
    };


};

//下面的类继承关系中,不同层级的类继承不同抽象函数,可以分函数抽象一个类,见Bridge模式。

class APhoneNoraml:public MobilePhone
{
public:
    virtual ~APhoneNoraml(){};

    virtual void PhoneMaterial()override{
        std::cout << "Glass material" << std::endl;
    };

    virtual void PhoneColor()override{
        std::cout << "2 Colors" << std::endl;
    };

    virtual void PhoneCameNum()override{
        std::cout << "2 CamNum" << std::endl;
    };
};

class BPhoneNoraml:public MobilePhone
{
public:
    virtual ~BPhoneNoraml(){};

    virtual void PhoneMaterial()override{
        std::cout << "Glass material" << std::endl;
    };

    virtual void PhoneColor()override{
        std::cout << "3 Colors" << std::endl;
    };

    virtual void PhoneCameNum()override{
        std::cout << "3 CamNum" << std::endl;
    };
};


class APhoneHiger:public APhoneNoraml
{
public:
    virtual ~APhoneHiger(){};

    virtual void BootAnimation()override{
        APhoneNoraml::PhoneMaterial();
        APhoneNoraml::PhoneColor();
        APhoneNoraml::PhoneCameNum();
        std::cout << "good luck" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base txt type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 20 app" << std::endl;
    };
};

class BPhoneHiger:public BPhoneNoraml
{
public:
    virtual ~BPhoneHiger(){};

    virtual void BootAnimation()override{
        BPhoneNoraml::PhoneMaterial();
        BPhoneNoraml::PhoneColor();
        BPhoneNoraml::PhoneCameNum();
        std::cout << "gook lunck" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base txt type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 20 app" << std::endl;
    };

};

class APhonePro:public APhoneNoraml
{
public:
    virtual ~APhonePro(){};

    virtual void BootAnimation()override{
        APhoneNoraml::PhoneMaterial();
        APhoneNoraml::PhoneColor();
        APhoneNoraml::PhoneCameNum();
        std::cout << "best wishes" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base 3 type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 30 app" << std::endl;
    };
};

class BPhonePro:public BPhoneNoraml
{
public:
    virtual ~BPhonePro(){};

    virtual void BootAnimation()override{
        BPhoneNoraml::PhoneMaterial();
        BPhoneNoraml::PhoneColor();
        BPhoneNoraml::PhoneCameNum();
        std::cout << "best wishes" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base 3 type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 30 app" << std::endl;
    };

};

int main()
{
    MobilePhone* higherA = new APhoneHiger();
    higherA->BootAnimation();
    higherA->NetPrintType();
    higherA->SoftSuppotNum();
    delete higherA;
    higherA = nullptr;


    MobilePhone* proA = new APhonePro();
    proA->BootAnimation();
    proA->NetPrintType();
    proA->SoftSuppotNum();
    delete proA;
    proA = nullptr;
    return 0;
}

运行结果如下:

设计模式之Bridge模式的C++实现,设计模式,C/C++语言,设计模式,桥接模式

6、使用Bridge设计模式实现

#include <iostream>

//将第一个变化维度的三个函数抽象成一个类,供第二层继承使用
class MobilePhone
{
public:
    //手机材质
    virtual void PhoneMaterial()=0;
    //手机颜色
    virtual void PhoneColor()=0;
    //手机大小
    virtual void PhoneCameNum()=0;
    virtual ~MobilePhone(){}
};

//将第二个变化维度的三个函数抽象出一个类,供第三层继承使用
class MobileSoft
{
public:
    MobileSoft(MobilePhone* p):Imp(p){};
    MobilePhone *Imp;
    //开机动画
    virtual void BootAnimation()=0;
    //网络打印类型
    virtual void NetPrintType()=0;
    //软件支持数目
    virtual void SoftSuppotNum()=0;
};

class APhoneNoraml:public MobilePhone
{
public:
    virtual ~APhoneNoraml(){};

    virtual void PhoneMaterial()override{
        std::cout << "Glass material" << std::endl;
    };

    virtual void PhoneColor()override{
        std::cout << "2 Colors" << std::endl;
    };

    virtual void PhoneCameNum()override{
        std::cout << "2 CamNum" << std::endl;
    };
};

class BPhoneNoraml:public MobilePhone
{
public:
    virtual ~BPhoneNoraml(){};

    virtual void PhoneMaterial()override{
        std::cout << "Glass material" << std::endl;
    };

    virtual void PhoneColor()override{
        std::cout << "3 Colors" << std::endl;
    };

    virtual void PhoneCameNum()override{
        std::cout << "3 CamNum" << std::endl;
    };
};

//在第三层继承关系处使用对象组合。
class PhoneHiger:public MobileSoft
{
public:
    PhoneHiger(MobilePhone *p):MobileSoft(p){};
    virtual ~PhoneHiger(){};

    virtual void BootAnimation()override{
        Imp->PhoneMaterial();
        Imp->PhoneColor();
        Imp->PhoneCameNum();
        std::cout << "good luck" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base txt type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 20 app" << std::endl;
    };
};


class PhonePro:public MobileSoft
{
public:
    PhonePro(MobilePhone *p):MobileSoft(p){};
    virtual ~PhonePro(){};

    virtual void BootAnimation()override{
        Imp->PhoneMaterial();
        Imp->PhoneColor();
        Imp->PhoneCameNum();
        std::cout << "best wishes" << std::endl;
    };

    virtual void NetPrintType()override{
        std::cout << "Support base 3 type" << std::endl;
    };

    virtual void SoftSuppotNum()override{
        std::cout << "Support 30 app" << std::endl;
    };
};

int main()
{
    std::cout << " ************** PhoneHiger ************** " << std::endl;
    MobilePhone *normalA = new APhoneNoraml();
    MobileSoft *higherA = new PhoneHiger(normalA);
    higherA->BootAnimation();
    higherA->NetPrintType();
    higherA->SoftSuppotNum();

    std::cout << "\n ************** PhonePro ************** " << std::endl;
    MobilePhone *normalPro = new APhoneNoraml();
    MobileSoft *proA = new PhonePro(normalPro);
    proA->BootAnimation();
    proA->NetPrintType();
    proA->SoftSuppotNum();
    return 0;
}

运行结果如下:

设计模式之Bridge模式的C++实现,设计模式,C/C++语言,设计模式,桥接模式

       上面的代码将不同的变化维度分别抽象成一个类,供子类继承;并且其中一个维度的继承关系用“类成员是基类对象”组合的方式进行替代,使功能类代码具有良好的扩展性,也遵循单一职责原则。文章来源地址https://www.toymoban.com/news/detail-637309.html

到了这里,关于设计模式之Bridge模式的C++实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式之Bridge模式的C++实现

    目录 1、Bridge模式的提出 2、Bridge模式的定义 3、Bridge模式总结 4、需求描述 5、多继承方式实现 6、使用Bridge设计模式实现         在软件功能模块设计中,如果类的实现功能划分不清晰,使得继承得到的子类往往是随着需求的变化,子类急剧膨胀,充斥重复代码。将类要实现

    2024年02月13日
    浏览(44)
  • 用Rust实现23种设计模式之桥接模式

    桥接模式的优点: 桥接模式的设计目标是将抽象部分和实现部分分离,使它们可以独立变化。这种分离有以下几个优点: 解耦和灵活性 :桥接模式可以将抽象部分和实现部分解耦,使它们可以独立地变化。这样,对于抽象部分的修改不会影响到实现部分,反之亦然。这种解

    2024年02月14日
    浏览(45)
  • 【设计模式】桥接模式

    桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结

    2024年02月13日
    浏览(62)
  • 设计模式——桥接模式

    引用 桥 我们大家都熟悉,顾名思义就是用来将河的两岸联系起来的。而此处的桥是用来将两个独立的结构联系起来,而这两个被联系起来的结构可以独立的变化,所有其他的理解只要建立在这个层面上就会比较容易。 基本介绍 桥接模式(Bridge)是指将实现与抽象放在两个不

    2024年02月12日
    浏览(49)
  • 设计模式——桥接模式详解

    1.1⭐桥接模式的定义 维基百科: 桥接模式 是软件设计模式中最复杂的模式之一,它把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。 百度百科: 桥接模式 是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,

    2024年02月06日
    浏览(50)
  • 设计模式:桥接模式

    桥接模式(Bridge Pattern):旨在将抽象部分和实现部分解耦,使它们可以独立地变化。这种模式通过将抽象和实现分离,使它们可以独立地进行扩展和修改,而不会相互影响。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。 假如需要使用大

    2024年01月25日
    浏览(53)
  • 设计模式 07 桥接模式

    桥接模式(Bridge Pattern)属于 结构型 模式 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为 柄体 (Handle and Body)模式或 接口 (Interface)模式。 比如需要创建电脑对象,市面上的电脑非常多, 品牌 有华为、苹果、联

    2024年02月11日
    浏览(54)
  • 设计模式之~桥接模式

    桥接模式:         将抽象部分与它的实现部分分离,使他们都可以独立地变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。         什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因

    2024年02月07日
    浏览(39)
  • 设计模式详解-桥接模式

    类型:结构型模式 实现原理:将抽象类和实现类分离,使其独立,然后使用接口再将二者连接起来。 意图:将抽象部分与实现部分分离,使它们都可以独立的变化。 主要解决:类变化频繁时用继承可能会出现的类爆炸问题。 如何解决:减少类的耦合关系,让类独立变化。

    2024年02月12日
    浏览(43)
  • 设计模式-桥接模式

    适配器模式 类似,以后也会遇到意思接近一样的设计模式。在开发中一般多个模式混用,且根据不同的场景进行搭配,桥接模式也是 结构型模式 将抽象的部分和实现的部分分离,使它们都可以独立的变化。通俗来说,就是通过组合来 桥接 其它的 行为或维度 与适配器模式业

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包