C++设计模式----桥接模式

1、介绍

        桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得它们可以独立地变化。桥接模式的核心思想是利用组合关系代替继承关系,将系统划分成多个独立的、功能不同的类层次结构,并通过桥接类将它们连接起来。
        在桥接模式中,有两个重要的概念:抽象化(Abstraction)和实现化(Implementation),它们分别对应了系统的抽象部分和实现部分。抽象化负责定义接口,并维护一个指向实现化对象的指针;实现化则负责定义具体的实现方法

桥接模式详解:
(1)角色定义:

        Abstraction(抽象化角色):定义抽象接口,维护一个对Implementor对象的引用。
        RefinedAbstraction(具体抽象化角色):是Abstraction的一个子类,对Abstraction接口进行一些补充。
        Implementor(实现化角色):定义实现化角色的接口,任何Abstraction角色可以调用。
        ConcreteImplementor(具体实现化角色):Implementor接口的具体实现。
(2)工作原理

        抽象化角色持有实现化角色的引用,它只需要定义与客户端的接口并委托给实现化角色来执行。
        具体化角色继承抽象化角色并实现自己的业务逻辑,同时构造时关联相应的实现化角色。

应用场景:

(1)图形界面库

        图形界面库通常提供一组通用的界面元素(如按钮、文本框、下拉菜单等),同时也提供多种不同的绘制方式(如窗口系统的绘制、OpenGL的绘制等)。桥接模式可以将界面元素和绘制方式解耦,使得它们可以独立地变化。

        例如,可以定义一个抽象类“UIElement”,它包含一个指向“Graphics”类的指针。通过调用“Graphics”类的绘制方法,可以绘制不同的界面元素,而不影响界面元素本身的定义。

(2)操作系统文件系统

        文件系统需要支持多种存储介质(如磁盘、光盘、网络存储等)和多种文件系统类型(如FAT32、NTFS、EXT4等)。桥接模式可以将存储介质和文件系统类型解耦,使得它们可以独立地变化。

        在Windows操作系统中,可以定义一个抽象类“File”,它包含一个指向“Storage”类和“FileSystem”类的指针。通过调用“Storage”类的读写方法和“FileSystem”类的文件操作方法,可以完成文件的读写和操作。

(3)游戏开发中的人物角色

        在游戏开发中,人物角色通常具有多种不同的属性和技能(如力量、敏捷、法力等),同时人物角色还可以使用多种不同的武器和装备(如剑、弓、盾等)。桥接模式可以将属性和技能解耦,使得它们可以独立地变化。

        例如,可以定义一个抽象类“Character”,它包含一个指向“Attribute”类和“Skill”类的指针。通过调用“Attribute”类的方法和“Skill”类的方法,可以处理人物角色的属性和技能。

(4)网络通信框架

        在网络通信框架中,抽象接口可以定义诸如发送消息、接收消息等功能,而具体实现可以包括TCP、UDP、WebSocket等多种协议。桥接模式允许上层应用只关注消息的发送和接收逻辑,而无需关心底层通信协议的具体实现。

(5)多语言本地化

        在国际化应用中,桥接模式可以将界面的逻辑(如按钮、标签、提示信息等)与具体语言环境(如英文、中文、法文等)分离。通过桥接模式,可以在切换不同语言环境时,仅替换具体的本地化实现,而无需修改界面的逻辑部分。

2、示例

#include <iostream>

/**************************************************************************************/
// 实现化接口
class RoleImpl {  
public:  
    virtual ~RoleImpl() = default;  
    virtual void attack() = 0;  // 攻击行为  
    virtual void defend() = 0;  // 防御行为  
  
    // ... 其他与内部实现相关的操作  
};

// 具体实现化---战士
class WarriorImpl : public RoleImpl {  
public:  
    void attack() override {  
        std::cout << "Warrior attacks with sword!" << std::endl;  
    }  
  
    void defend() override {  
        std::cout << "Warrior blocks with shield!" << std::endl;  
    }  
  
    // ... 其他方法  
};
/**************************************************************************************/

/**************************************************************************************/
// 抽象化游戏角色
class Role {  
protected:
    RoleImpl* impl_;              // 内部实现的指针【包含一个实现化接口类对象指针】
public:  
    // 构造函数
    Role(RoleImpl* impl) : impl_(impl) {}
    // 析构函数
    virtual ~Role()
    {
        delete impl_;
    }

    virtual void display() = 0;   // 显示角色外观  
    virtual void fight() = 0;     // 角色战斗,通过内部实现执行  
  
    // ... 其他与外观相关的操作  
};

// 具体化游戏角色---战士
class WarriorRole : public Role {  
public:  
    WarriorRole(RoleImpl* impl) : Role(impl) {}  
  
    void display() override {  
        std::cout << "Warrior is ready for battle!" << std::endl;  
        // ... 其他与战士外观相关的操作  
    }  
  
    void fight() override {  
        impl_->attack(); // 调用内部实现的攻击方法  
        // ... 其他与战士战斗相关的操作  
    }  
  
    // ... 其他方法  
};  
/**************************************************************************************/

int main() {  
    RoleImpl* warriorImpl = new WarriorImpl();         // 创建战士的内部实现  
    Role* warriorRole = new WarriorRole(warriorImpl);  // 创建战士的外观,并关联内部实现  
  
    warriorRole->display();    // 显示战士的外观  
    warriorRole->fight();      // 战士战斗,执行内部实现的攻击方法  
  
    // ... 类似地创建和组合法师、弓箭手等角色  

    delete warriorRole;  
  
    return 0;  
}

结果:

Warrior is ready for battle!
Warrior attacks with sword!

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值