桥接与适配器关系

设计模式深度解析:适配器模式与桥接模式-灵活应对变化的两种设计策略大比拼 本文深入探讨了适配器模式与桥接模式在软件设计中的应用。适配器模式通过接口转换,使原本不兼容的类能够协同工作,展现了其强大的复用与整合能力;而桥接模式则实现了抽象与实现的分离,为软件架构的灵活性与扩展性提供了坚实支撑。两者在应对业务逻辑变化和技术革新方面均展现出了独特的优势。文章通过生动的示例和详细的解析,帮助读者深入理解这两种设计模式的核心思想和应用场景,为构建稳定且灵活的软件系统提供了有力指导。无论是初学者还是资深开发者,都能从中受益匪浅。 阅读详情
什么是“适配器”?

小白简介:
我想要一个三头插座的充电器但是现在的插排都两头的插座所以我想要一个连接三头插座的线,那么这个使用过程就是适配器模式,其中需要的三头插座就是适配类。

适配器模式(Adapter):
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。(是将原本有的接口编程客户需要的接口,如同下面的类图中:将进攻和防守的英文方法改为中文方法,这样外籍中锋就懂了)

在这里插入图片描述

此模式为对象适配器模式,适配器分为类适配器和对象适配器,类适配器通过对重继承对一个接口与另一个接口进行匹配,但是C#不支持多重继承,所以今天讲对象适配器。

首先我们需要先设定球员接口和前锋、中锋、后卫类

  /// <summary>
    /// 球员类
    /// </summary>
    abstract class Player
    {
        protected string name;
        public Player(string name)
        {
            this.name = name;
        }

        //进攻和防守方法
        public abstract void Attack();
        public abstract void Defense();
    }


    //前锋
    class Forwards:Player 
    {
    //此方法是直接访问父类
        public Forwards(string name)
            : base(name)
        {
        }

        public override void Attack()
        {
            Console.WriteLine("前锋{0} 进攻", name);
        }

        public override void Defense()
        {
            Console.WriteLine("前锋{0} 防守", name);           
        }
    }

    //中锋
    class Center:Player 
    {
    //此方法是直接访问父类
        public Center(string name)
            : base(name)
        {
        }

        public override void Attack()
        {
            Console.WriteLine("前锋{0} 进攻", name);
        }

        public override void Defense()
        {
            Console.WriteLine("前锋{0} 防守", name);           
        }
    }

    //后卫
    class Guards:Player 
    {
    //此方法是直接访问父类
         public Guards(string name)
            : base(name)
        {
        }

        public override void Attack()
        {
            Console.WriteLine("前锋{0} 进攻", name);
        }

        public override void Defense()
        {
            Console.WriteLine("前锋{0} 防守", name);           
        }
    }

接着我们书写外籍中锋和翻译者类:

 /// <summary>
    /// 外籍中锋
    /// </summary>
    class ForeignCenter 
    {
        private string name;
        public string Name
        {
            //外籍中锋类球员的姓名故意用属性而不是构造方法来区别于前三个球员类的不同
            get { return name; }
            set { name = value; }
        }


        //以下标明“外籍中锋"只懂得中文“进攻” 和“防守”
        public void 进攻()
        {
            Console.WriteLine("外籍中锋{0} 进攻", name);
        }

        public void 防守()
        {
            Console.WriteLine("外籍中锋{0} 防守", name);
        }
    }

    /// <summary>
    /// 翻译者类
    /// </summary>
    class Translator:Player 
    {
        private ForeignCenter wjzf = new ForeignCenter();
        public Translator(string name)
            : base(name)
        {
            wjzf.Name = name;
        }

        public override void Attack()
        {
            wjzf.进攻();          
        }

        public override void Defense()
        {
            wjzf.防守();        }
    }

方法总结:
前面的球员和几个身份都是我们一致的接口和实现接口,然后外籍中锋的名字为了区别和其他不同所以自己构造一个姓名方法,接着方法名是中文的,在翻译者类中只是重写了球员接口的方法,将里面改为外籍中锋的方法。,然后在客户端请看:

 static void Main(string[] args)
        {
            Player b = new Forwards("巴塞尔");
            b.Attack();
            Player m = new Guards("麦克地雷地");
            m.Attack();


            //翻译者告诉姚明,教练要求你既要“进攻” 又要“防守”
            Player ym = new Translator("姚明");
            ym.Attack();
            ym.Defense();

            Console.Read();
        }

运行结果:
在这里插入图片描述

接下来请看桥接模式

首先我们先了解一下合成/聚合复用原则(CARP),尽量使用合成/聚合原则,尽量不要使用类继承:因为使用CARP有助于保持每个类被封装,并被集中在单个任务上,这样类和类继承会保持较小规模,说白了就是手机品牌应该包含手机软件,但是软件并不是手机品牌的一部分,,这样就不会将全部的信息都放在手机品牌里面,大大减少了耦合,让其分离出来。

桥接模式:
将抽象部分与它的实现部分分离,使他们都可以独立的变化。(就是让抽象类和派生类分离,原本手机软件是手机的一部分,现在让手机软件分离出来),请看类图关系:

在这里插入图片描述

首先写出我们的手机软件接口和两个手机软件

 /// <summary>
    /// 手机软件接口
    /// </summary>
    abstract class Soft
    {
        public abstract void Run();
    }


    /// <summary>
    /// 手机游戏
    /// </summary>
    class Game: Soft
    {
        public override void Run()
        {
            Console.WriteLine("手运行机游戏");
        }
    }
    /// <summary>
    /// 手机音乐
    /// </summary>
    class Music : Soft
    {
        public override void Run()
        {
            Console.WriteLine("运行手机音乐");            
        }
    }

接着我们写手机品牌接口和两个手机类型

 /// <summary>
    /// 手机品牌接口
    /// </summary>
    abstract class Phone
    {
        protected Soft soft;   //连接手机软件

        public void SetSoft(Soft soft)
        {
            this.soft=soft;
        }

        public abstract void Run();
    }

    /// <summary>
    /// 手机品牌:Nokia
    /// </summary>
    class Nokia : Phone
    {
        public override void Run()
        {
            soft.Run();
        }
    }

    /// <summary>
    /// 手机品牌:Winphone
    /// </summary>
    class WinPhone:Phone 
    {
        public override void Run()
        {
            soft.Run();
        }
    }

方法总结:
在我们的类中只写一个手机品牌的接口和手机软件的接口,并且去分别实现他们不同的子类,因为手机品牌和软件是聚合关系,所以需要在软件接口那里做一个连接。 接着看客户端:

  static void Main(string[] args)
        {
            //实例化一个手机品牌Nokia,然后给他游戏和音乐的方法
            Phone ab = new Nokia(); ;

            ab.SetSoft(new Game());
            ab.Run();

            ab.SetSoft(new Music());
            ab.Run();


            //实例化一个手机品牌WinPhone,然后给他音乐和游戏的方法
            Phone cd = new WinPhone();

            cd.SetSoft(new Game());
            cd.Run();

            cd.SetSoft(new Music());
            cd.Run();

            Console.Read();
        }

运行结果:
在这里插入图片描述

小结

相同点:
两者都是结构型设计模式,采用继承机制来组合接口或实现。

不同点:
适配器模式是将一个类的接口转换成客户希望的另一个接口。而桥接是将抽象部分与其实现部分分离,使它们都可以独立的变化。

小结:
更多的不同点和区别已经在代码和说明处给出,这样写的好处是更加深刻的体会出设计模式的细节所在,更多的还需要我们共同讨论出来哦。

ROS2 -Jazzy 一步一步(第一步_工作空间以及编译) 文件夹作用特点是否需要手动创建/维护src存放自己写的 ROS 2 包一个 workspace 可以有多个包需要手动创建build保存编译过程中的中间文件每个包生成对应子目录自动生成,可删除install保存编译完成后的功能包每个包有独立子目录,含可执行文件自动生成,可删除log保存编译日志用于查看错误原因、调试自动生成,不需修改colcon是 ROS 2 推荐使用的构建工具自动处理功能包的依赖和编译顺序一条命令就能编译整个工作空间。 阅读详情

相关推荐

【运筹优化】VRPTW建模实战:Python+Gurobi求解带时间窗的车辆路径规划

本文详细介绍了如何使用Python和Gurobi求解带时间窗的车辆路径问题(VRPTW)。通过将物流调度难题抽象为混合整数规划模型,并逐步讲解建模、编码与求解过程,为读者提供了从理论到实践的完整指南,帮助解决物流配送中的路径优化挑战。

peace的博客 201

适配器模式

在NBA现役中锋期,姚明也算是一个天才吧。姚明NBA打球,交流是一个很大的的问题,那么怎么解决呢?为他配一个翻译啦。这里就和软件工程中的一个模式很相似,适配器模式。模式定义适配器模式(Adapter),将一个类的接口装换成客户希望的另外一个接口。Adapter模式使得原本不兼容而不能在一起工作的那些类可以一起工作。【DP】模式结构模式实现球员package com.bjsxt.adapter; ...

徐伯莱 2139

TMS320F280049C 学习笔记21 交叉开关 Crossbar (X-BAR)

简单介绍了X-BAR。

whyorwhnt的专栏 2万+

桥接设计模式

桥接设计模式 在开始学java的时候老师讲到继承的时候,总是喜欢用一个例子来讲解,那就是画图,这里有一个画笔,可以画正方形、长方形、圆形(这个大家都知道怎么做吧,我就不解释了)。但是现在我们需要给这些形状进行上色,这里有三种颜色:白色、灰色、黑色。这里我们可以画出3*3=9中图形:白色正方形、白色长方形、白色圆形。。。。。。到这里了我们几乎到知道了这里存在两种解决方案: 方案一:为每种形状都提供各种颜色的版本。 方案二:根据实际需要对颜色和形状进行组合。 我们我们采用方案一来实现的话,我们是不是也可以这样来

Wxc的Blog 428

别再怕DRIVER_VERIFIER_DMA_VIOLATION蓝屏:手把手教你用WinDbg分析IOMMU与驱动冲突

本文深入解析DRIVER_VERIFIER_DMA_VIOLATION蓝屏错误,从IOMMU原理到实战排错,手把手教你使用WinDbg分析驱动冲突。通过理解DMA与IOMMU的核心机制、搭建分析环境、解读DMAR表与设备拓扑,最终定位问题驱动并提供解决方案,帮助开发者和IT运维人员有效应对此类系统崩溃问题。

weixin_30298497的博客 803

海康视觉平台VisionMaster通讯实战:三种触发方式深度解析

本文深度解析海康视觉平台VisionMaster的三种通讯触发方式:字符串触发、接收字符串事件触发和轮询D地址触发。通过实际案例和配置技巧,帮助工程师在工业场景中实现高效、稳定的设备通讯,提升视觉系统的集成效率和可靠性。

weixin_42665255的博客 281

如何应用设计模式设计你的足球引擎(第一、二部分)

  原文地址:http://www.codeproject.com/KB/architecture/applyingpatterns.aspx 作者:An OOP Madhusudanan 译者:赖勇浩(http://blog.youkuaiyun.com/lanphaday ) 译者说:这是一篇非常好的文章,有非常棒的例子,非常棒的文笔,非常棒的代码(VB.net编写的,但你肯定读得懂),如果你还不懂设

赖勇浩的编程私伙局 8455

Transformers 中的 Softmax 可以并行加速么?

通过融合前两个计算步骤,降低执行Reduce_max和Reduce_sum等操作的通信开销。利用共享内存来存储临时数据,以减少对全局内存的访问成本。

stephen147的博客 1234

使用适配器模式模拟篮球队翻译 C++

说下对适配器模式的理解: 适配器模式: 将一个类的接口转换成客户希望的另外一个接口, 他使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 ie, 系统的数据和行为都是正确的, 但是接口不服符合时, 我们就应该考虑使用适配器, 目的是使得控制范围之外的一个原有对象与某个接口匹配。 适配器模式主要应用于希望复用一些现存的类, 但是接口又与复用环境不一致的情况。 一般在后期维护, 或者调用

zhyh1435589631的专栏 704

高通Camera IFE时钟配置

高通Camera IFE时钟配置中的minHorizontalBlanking和minVerticalBlanking配置计算方法

一个懒癌的驱动工程师的随笔分享 6168

2026.3.9:具身智能之GraspNet:Ubuntu24.04安装GraspNet

本文详细介绍了在Ubuntu24.04系统下安装GraspNet具身智能框架的全过程。主要包括:1) 创建Python3.9虚拟环境;2) 安装CUDA12.8和PyTorch2.7.0等基础依赖;3) 编译安装pointnet2、knn和graspnetAPI三个核心组件;4) 修改源码适配新版PyTorch;5) 下载预训练权重并成功运行demo。安装过程中特别提示了可能遇到的报错处理方案,最终在GPU环境下实现了GraspNet的部署运行。整个流程涵盖了从环境配置到项目运行的完整步骤,为具身智能研究者

拥抱具身智能,昇腾Ascend C 204

适配器、桥接与外观三模式之间关系

适配器模式和桥接模式都是间接引用对象,因此可以使系统更灵活,在实现上都涉及从自身以外的一个接口向被引用的对象发出请求。   两种模式的区别在于使用场合不同,适配器模式主要解决两个已有接口间的匹配问题,这种情况下被适配的接口的实现往往是一个黑匣子。我们不想,也不能修改这个接口及其实现。同时也不可能控制其演化,只要相关的对象能与系统定义的接口协同工作即可。适配器模式经常用在与第三方产品的功能集成...

大黄_sama 283

OpenClaw 多代理协同工作模式配置指南

OpenClaw 采用。

形上得其象,形下合于数;阴阳自济,玄理自明。 1万+

Dot Net设计模式—适配器、桥接与外观三模式之间的关系

这几天一直在研究各种各样的设计模式,在学习适配器模式、桥接模式和外观模式模式的时候,发现他们之间存在着一定的关系,实际上模式不适单一存在的,在我们的现实编程生活中往往是几种模式结合使用的。1.适配器模式与桥接模式的区别和联系适配器模式和桥接模式都是间接引用对象,因此可以使系统更灵活,在实现上都涉及从自身以外的一个接口向被引用的对象发出请求。两种模式的区别在于使用场合不同,适配器模式主要解决

NETZHOU的专栏 1058

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

.Net中适配器、桥接与外观三模式的关系

1.适配器模式与桥接模式的区别和联系  适配器模式和桥接模式都是间接引用对象,因此可以使系统更灵活,在实现上都涉及从自身以外的一个接口向被引用的对象发出请求。   两种模式的区别在于使用场合不同,适配器模式主要解决两个已有接口间的匹配问题,这种情况下被适配的接口的实现往往是一个黑匣子。我们不想,也不能修改 这个接口及其实现。同时也不可能控制其演化,只要相关的对象能与系统定义的接口协同工作即可。适配...

weixin_30852419的博客 88

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

结构性型模式概述02--适配器模式--桥接模式

文章目录适配器模式(Adapter模式)详解优点:缺点 :模式的结构与实现模式结构:模式的应用场景桥接模式(Bridge模式)详解桥接模式的定义与特点缺点:桥接模式的结构与实现模式的结构桥接模式的应用场景 适配器模式(Adapter模式)详解 模式的定义与特点: 定义: 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 适配器模式分为类结构模型和对象结构模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少

qq_44236958的博客 479

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

2022-2-7 类和类之间的关系:复合(composition)、委托(delegation)、继承(inheritance) 适配器模式(adapter)桥接模式(handle/body) 虚函数

学习时间及标题: 2022-2-7 类和类之间的关系:复合(composition)、委托(delegation)、继承(inheritance) 桥接模式(handle/body) 虚函数(virtual functions) 学习内容: 1.复合(composition)–has a:   红色的部分是编译器帮我们加上的,而当你需要用到其他除默认以外的构造函数时,需自己写上。 2.委托(delegation)–composition by reference:   这里的by referenc

qq_44061716的博客 470

桥接模式

文章目录 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> enum Dumpling{Meat,Normal}; typedef struct _MeatDumpling { void (*make)(); }MeatDumpli...

qq_23929673的博客 703

设计模式之桥接模式与适配器模式

适配器模式: 定义:见名知意,适配器就是做适配工作。将一个类的接口转换成客户期望的另一个接口,从而使原本因接口不匹配的两个类能够一起工作,其功能就是把一个接口转成另一个接口。 实际问题: 各个国家之间的插座接口不一致或者电压不一致: 格式工厂:某个播放器不支持某种格式的视频,这个问题我们经常遇到。我们一般的做法由两种:第一种换一个更强大的播放器,第二种我们先去将手上的视频转换成该播放器支...

路漫漫,反复求索。 981

桥接模式、适配器模式以及外观模式三者的区别

感谢原作者,这篇博客让我对这三个模式的认识更加深刻了,原链接:Dot Net设计模式—适配器、桥接与外观三模式之间的关系              这几天一直在研究各种各样的设计模式,在学习适配器模式、桥接模式和外观模式模式的时候,发现他们之间存在着一定的关系,实际上模式不适单一存在的,在我们的现实编程生活中往往是几种模式结合使用的。 1.适配器模式与桥接模式的区别和联系  

独行闹市无人问,青灯剑影响素琴 2887

OOP面向对象编程:类与类之间的关系

三大关系:复合(适配器设计模式)、委托(桥接设计模式)、继承。

qq_43424630的博客 677

设计模式学习笔记十四:适配器模式、桥接模式与外观模式

1.适配器模式与桥接模式的区别和联系 适配器模式和桥接模式都是间接引用对象,因此可以使系统更灵活,在实现上都涉及从自身以外的一个接口向被引用的对象发出请求。 两种模式的区别在于使用场合的不同,适配器模式主要解决两个已经有接口间的匹配问题,这种情况下被适配的接口的实现往往是一个黑匣子。我们不想,也不能修改这个接口及其实现。同时也不可能控制其演化,只要相关的...

架构未来 124

DP讨论——适配器、桥接、代理、装饰器模式通用理解

适配器模式和桥接模式,实现上基本没啥区别,怎么区分?只能从上下文理解,看目的是啥。它们,我左看上看下看右看,发现理解可以这么简单:都是A类调用B/C/D等类的方法。它们的关系采用组合关系,也就是基本是A类里包含BCD等类,然后实现方法来调用BCD等类的基类方法。

huibin.yun的博客 301
上一篇: SQLServer导出/倒入脚本
下一篇: 编译语言原理--文法
@Herry
博客等级 码龄10年 85粉丝 251原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值