《设计模式的艺术》笔记 - 桥接模式

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

介绍

        桥接模式将抽象部分与其实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体模式或接口模式

实现

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class Implementor { // 实现抽象类,例如颜料
public:
    virtual void operationImpl() = 0;
};

class Abstract {    // 抽象类,例如毛笔
public:
    virtual void operation() = 0;
protected:
    Implementor *m_imp;
};

class RefinedAbstraction : public Abstract {    // 扩充抽象类,例如大号毛笔
public:
    RefinedAbstraction(Implementor *imp);
    ~RefinedAbstraction();
    void operation() override;
};

class ConcreteImplementorA : public Implementor {   // 具体实现类,例如红色颜料
public:
    void operationImpl() override;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"

RefinedAbstraction::RefinedAbstraction(Implementor *imp) {
    m_imp = imp;
}

RefinedAbstraction::~RefinedAbstraction() {
    
}

void RefinedAbstraction::operation() {
    if (m_imp) {
        m_imp->operationImpl();
    }
    std::cout << "RefinedAbstraction::operation()" << std::endl;
}

void ConcreteImplementorA::operationImpl() {
    std::cout << "ConcreteImplementorA::operationImpl()" << std::endl;
}

main.cpp

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    Implementor *imp = new ConcreteImplementorA();
    Abstract *ab = new RefinedAbstraction(imp);
    ab->operation();

    return 0;
}

总结

优点

        1. 分离抽象接口及其实现部分。桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化(即抽象和实现不再在同一个继承层次结构中,而是“子类化”它们,使它们各自都具有自己的子类,以便任意组合子类,从而获得多维度组合对象)

        2. 在很多情况下,桥接模式可以取代多层继承方案。多层继承方案违背了单一职责原则,复用性较差,且类的个数非常多。桥接模式是比多层继承方案更好的解决方法,它极大地减少了子类的个数。

        3. 桥接模式提高了系统的可扩展性。在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合开闭原则。

缺点

        1. 桥接模式的使用会增加系统的理解与设计难度。由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。

        2. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。

适用场景

        1. 如果一个系统需要在抽象类和具体类之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。

        2. 抽象部分和实现部分可以以继承的方式独立扩展而互不影响,在程序运行时可以动态地将一个抽象类子类的对象和一个实现类子类的对象进行组合,即系统需要对抽象类角色和实现类角色进行动态耦合。

        3. 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。

        4. 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

练习

myclass.h

//
// Created by yuwp on 2024/1/12.
//

#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H

#include <iostream>

class FileFormat { // 实现抽象类
public:
    virtual void toFile(std::string data, std::string file) = 0;
};

class Database {    // 抽象类
public:
    virtual void trans() = 0;

protected:
    FileFormat *m_fileFormat;
};

class MysqlDatabase : public Database {    // 扩充抽象类
public:
    MysqlDatabase(FileFormat *fileFormat);
    void trans() override;

};

class RedisDatabase : public Database {
public:
    RedisDatabase(FileFormat *fileFormat);
    void trans() override;

protected:
    FileFormat *m_fileFormat;
};

class TXTFileFormat : public FileFormat {   // 具体实现类,例如红色颜料
public:
    void toFile(std::string data, std::string file) override;
};

class XMLFileFormat : public FileFormat {
public:
    void toFile(std::string data, std::string file) override;
};

class PDFFileFormat : public FileFormat {
public:
    void toFile(std::string data, std::string file) override;
};

#endif //DESIGNPATTERNS_MYCLASS_H

myclass.cpp

//
// Created by yuwp on 2024/1/12.
//

#include "myclass.h"

MysqlDatabase::MysqlDatabase(FileFormat *fileFormat) {
    m_fileFormat = fileFormat;
}

void MysqlDatabase::trans() {
    std::string data = "mysql";
    if (m_fileFormat) {
        m_fileFormat->toFile(data, "mysql");
    }
}

RedisDatabase::RedisDatabase(FileFormat *fileFormat) {
    m_fileFormat = fileFormat;
}

void RedisDatabase::trans() {
    std::string data = "redis";
    if (m_fileFormat) {
        m_fileFormat->toFile(data, "redis");
    }
}

void TXTFileFormat::toFile(std::string data, std::string file) {
    std::cout << "\"" << data << "\"" << "转换为\"" << file << ".txt\"" << std::endl;
}

void XMLFileFormat::toFile(std::string data, std::string file) {
    std::cout << "\"" << data << "\"" << "转换为\"" << file << ".xml\"" << std::endl;
}

void PDFFileFormat::toFile(std::string data, std::string file) {
    std::cout << "\"" << data << "\"" << "转换为\"" << file << ".pdf\"" << std::endl;
}

main.cpp文章来源地址https://www.toymoban.com/news/detail-801657.html

#include <iostream>
#include <mutex>
#include "myclass.h"

int main() {
    FileFormat *txtFormat = new TXTFileFormat();
    FileFormat *xmlFormat = new XMLFileFormat();
    FileFormat *pdfFormat = new PDFFileFormat();
    Database *database = new MysqlDatabase(txtFormat);
    database->trans();
    delete database;
    database = new MysqlDatabase(xmlFormat);
    database->trans();
    delete database;
    database = new MysqlDatabase(pdfFormat);
    database->trans();
    delete database;

    database = new RedisDatabase(txtFormat);
    database->trans();
    delete database;
    database = new RedisDatabase(xmlFormat);
    database->trans();
    delete database;
    database = new RedisDatabase(pdfFormat);
    database->trans();

    delete txtFormat;
    delete xmlFormat;
    delete pdfFormat;

    return 0;
}

到了这里,关于《设计模式的艺术》笔记 - 桥接模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 《设计模式的艺术》笔记 - 策略模式

            策略模式定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式。策略模式是一种对象行为模式。 myclass.h myclass.cpp main.cpp         1. 策略模式提供了对开闭原则的完美支持。用户可以在不

    2024年01月25日
    浏览(41)
  • 《设计模式的艺术》笔记 - 外观模式

            外观模式中外部与一个子系统的通信通过一个统一的外观角色进行,为子系统中的一组接口提供一个一致的入口。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。 myclass.h myclass.cpp main.cpp    

    2024年01月19日
    浏览(46)
  • 《设计模式的艺术》笔记 - 装饰模式

            装饰模式动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。  myclass.h myclass.cpp main.cpp         1. 对于扩展一个对象的功能,装饰模式比继承更加灵活性,不会导致类的个数急剧增加

    2024年01月19日
    浏览(47)
  • 《设计模式的艺术》笔记 - 命令模式

            命令模式将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为模式,其别名为动作模式或事务模式。 myclass.h myclass.cpp main.cpp         只需要增加一个CommandQueue类即可

    2024年01月20日
    浏览(50)
  • 《设计模式的艺术》笔记 - 单例模式

            单例模式优点是可以确保系统中只存在单个对象实例,缺点是不便扩展,一定程度上违背单一原则,既提供业务方法,又提供创建对象方法         在类加载的时候就创建好对象,获取对象时直接返回即可         在类加载的时候没有创建对象,第一次获取对象

    2024年02月02日
    浏览(41)
  • 《设计模式的艺术》笔记 - 工厂方法模式

            在简单工厂模式中,当系统中需要引入新的产品时,由于静态工厂方法通过所传入的参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则。因此,工厂方法模式应运而生。工厂方法模式是定义一个用于创建对象的接口,让子类决定将哪一个

    2024年01月23日
    浏览(41)
  • 《设计模式的艺术》笔记 - 建造者模式

            建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造这模式是一种对象创建型模式。 myclass.h myclass.cpp main.cpp         优点:         1. 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建

    2024年01月16日
    浏览(36)
  • 《设计模式的艺术》笔记 - 迭代器模式

            迭代器模式提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为型模式。 myclass.h myclass.cpp main.cpp         1. 支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式。在迭代

    2024年01月24日
    浏览(42)
  • 《设计模式的艺术》笔记 - 抽象工厂模式

            提供了一个创建一系列相关或相互依赖的对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。         在抽象工厂模式中,每个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品,这些产品构成了一个产品族。

    2024年01月16日
    浏览(31)
  • 《设计模式的艺术》笔记 - 享元模式

            享元模式运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,是一种对象结构型模式。 myclass.

    2024年01月19日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包