c#桥接模式详解

基础介绍:

  将抽象部分与它的实现部分分离,使它们都可以独立地变化。适用于不希望在抽象和实现部分之间有固定的绑定关系的情况,或者类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充的情况。

  将抽象部分与实现部分分离,使它们都可以独立地变化。

  其实两个都是抽象的部分,更准确的说,是将一个事物中多个维度的变化分离

  比如不用软件运行在不同的操作系统上。

  操作系统是一个维度,分为ios、Android、Windows等。

  软件系统是一个维度,分别为微信、QQ、酷狗音乐等。

  一个维度可以认为是抽象部分,另一个维度可以认为是实现部分,而这两个维度可以独立扩充和维护。

  单独看起来比较复杂和难以理解,可以先大致看下基础结构,然后结合以下实例来解读。

  桥接模式的结构:

    Abstraction:定义抽象类的接口,一般为抽象类,规范RefinedAbstraction,并创建一个Implementor实例。主要靠这个类来进行桥接。

    RefinedAbstraction:Abstraction的子类,具体实现Abstraction里规定的方法。

    Implementor:定义实现类的接口,一般情况,Implementor接口仅为提供基本操作,而Abstraction则定义了基于基本操作的较高层次操作。

    ConcreteImplementor:Implementor的子类,具体实现Implementor接口 。

  在桥接模式中,两个类Abstraction和Implementor分别定义了抽象与行为类型的接口,通过调用子类实现抽象与行为的动态组合。

应用场景:

  适用于不希望在抽象和实现部分之间有固定的绑定关系的情况,或者类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充的情况。

创建方式:

  桥接模式的实现方式是通过在抽象类中持有一个指向实现类的引用,从而将抽象类与实现类解耦。

  通常情况下,抽象类和实现类都需要定义自己的接口,以便彼此之间进行通信。

实例一:不用软件运行在不同的操作系统上。

   操作系统是一个维度,分为ios、Android、Windows等。

   软件系统是一个维度,分别为微信、QQ、酷狗音乐等。

   这两个维度可以独立扩充和维护,一个维度可以认为是抽象部分,另一个维度可以认为是实现部分。

   实现部分中的接口(Implementor)只需提供基本操作,抽象部分中的接口(Abstraction)来创建一个实现接口(Implementor)实例,用这个实例将两部分紧密连续在一起。

   抽象部分也是基于这个实例才做一些较高层次的操作。

   在这里可以把操作系统当做抽象部分,把软件系统当做实现部分。

   在抽象部分中创建一个抽象类(Abstraction),该类中创建一个软件系统的实例,即实现类的实例(Implementor),并规定抽象部分具体实现类(RefinedAbstraction)要实现哪些方法。

   注:抽象类和接口主要起桥梁作用和规范作用(Abstraction和Implementor),其具体实现都在其子类中(RefinedAbstraction和ConcreteImplementor)。

   在实现部分中创建一个接口(Implementor),该接口主要规范实现类(ConcreteImplementor)需要实现的方法。

   RefinedAbstraction和ConcreteImplementor分别继承自Abstraction和Implementor,并实现其规定的方法。

   即:

     Abstraction ---》操作系统抽象类

     RefinedAbstraction---》ios、Android、Windows等具体实现

     Implementor----》软件接口类

     ConcreteImplementor---》微信、QQ、酷狗音乐等具体实现

1、软件接口类

/// <summary>
    /// 软件接口类
    /// </summary>
    public interface ISoftWare
    {
        /// <summary>
        /// 定义一个软件启动方法
        /// </summary>
        void Start();
    }

Implementor-实现类接口,只声明最基本的方法。

2、软件实现类

/// <summary>
    /// 微信
    /// </summary>
    public class WeChat : ISoftWare
    {
        public void Start()
        {
            Console.WriteLine("启动微信");
        }
    }

    /// <summary>
    /// QQ
    /// </summary>
    public class TencentQQ : ISoftWare
    {
        public void Start()
        {
            Console.WriteLine("启动QQ");
        }
    }

ConcreteImplementor-继承自实现类接口,实现其基本方法。

3、系统抽象类

/// <summary>
    /// 系统抽象类(桥接类)
    /// </summary>
    public abstract class SystemPlatform
    {
        //创建软件类实例
        public ISoftWare _softWare;

        //通过构造函数注入具体软件实例
        public SystemPlatform(ISoftWare softWare)
        {
            this._softWare = softWare;
        }

        //执行软件运行
        public abstract void Run();
    }

Abstraction-操作系统抽象类,创建一个实现类实例,用来访问实现类内的操作。

该类为实际的桥接类,其他还规范了更高一层的方法。

4、系统平台实现类

/// <summary>
    /// ios系统
    /// </summary>
    public class IosSys : SystemPlatform
    {
        public IosSys(ISoftWare softWare)
            : base(softWare)
        {
            Console.WriteLine("进入IOS系统");
        }
        public override void Run()
        {
            _softWare.Start();
        }
    }

    /// <summary>
    /// Android系统
    /// </summary>
    public class AndroidSys : SystemPlatform
    {
        public AndroidSys(ISoftWare softWare)
           : base(softWare)
        {
            Console.WriteLine("进入Android系统");
        }
        public override void Run()
        {
            _softWare.Start();
        }
    }

RefinedAbstraction-系统抽象具体实现类,实现了各个实际功能。

 5、客户端

/// <summary>
    /// 客户端
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            //创建软件对象
            WeChat weChat = new WeChat();
            TencentQQ tencentQQ = new TencentQQ();

            //创建操作系统并安装软件
            SystemPlatform systemPlatform = new IosSys(weChat);
            systemPlatform.Run();

            systemPlatform = new AndroidSys(tencentQQ);
            systemPlatform.Run();

            Console.ReadKey();
        }
    }

这只是一个简单的实例,如果一个系统中预装载多个软件,可以将构造函数改为集合参数或者申明其他公开方法进行预安装。

实例二:不同形状的物体赋予不同颜色。

   不同形状的物体是一个维度,分别为长方形、矩形、圆形等。

   不同颜色是一个维度,分别为白色、黑色、红色等。

   即:

    Abstraction ---》形状抽象类

    RefinedAbstraction---》方形 圆形等具体实现

    Implementor----》颜色接口类

    ConcreteImplementor---》白色 黑色等具体实现

1、颜色接口类

1     public interface Color
2     {
3         void Bepaint();
4     }

规范颜色实现类,并供形状抽象类使用和维护。

2、颜色实现类

public class White : Color
    {
        public void Bepaint()
        {
            Console.WriteLine("白色的");
        }
    }

    public class Gray : Color
    {
        public void Bepaint()
        {
            Console.WriteLine("灰色的");
        }
    }

    public class Black : Color
    {
        public void Bepaint()
        {
            Console.WriteLine("黑色的");
        }
    }

3、形状抽象类

public abstract class Shape
    {
        public Color color;
        public void SetColor(Color color)
        {
            this.color = color;
        }
        public abstract void Draw();
    }

创建颜色实例供实现类使用,并规范实现类。

这个类主要是将形状和颜色两个维度的东西联系在一起,并制定高一级的操作规范。

4、形状实现类

public class Circle : Shape
    {
        public override void Draw()
        {
            color.Bepaint();
            Console.WriteLine("圆形");
        }
    }
    public class Rectangle : Shape
    {

        public override void Draw()
        {
            color.Bepaint();
            Console.WriteLine("长方形");
        }
    }
    public class Square : Shape
    {
        public override void Draw()
        {
            color.Bepaint();
            Console.WriteLine("正方形");
        }
    }

具体实现类

5、客户端

class Client
    {
        static void Main(string[] args)
        {
            //白色
            Color white = new White();
            //正方形
            Shape square = new Square();
            //白色的正方形
            square.SetColor(white);
            square.Draw();

            //长方形
            Shape rectange = new Rectangle();
            rectange.SetColor(white);
            rectange.Draw();

            Console.ReadKey();
        }
    }

其实颜色和形状两个维度的东西,各自维护和发展并不互相影响。

使用的时候也是将一个维度的东西加装的另一个维度上去,搭建一个桥梁供另一个维度去使用。

至于怎么加载就无所谓了,可以在构造函数中指定,也可以在方法参数中传递。

总结:

  将抽象部分与它的实现部分分离,使它们都可以独立地变化

  桥接模式的实现方式是通过在抽象类中持有一个指向实现类的引用,从而将抽象类与实现类解耦。

  通常情况下,抽象类和实现类都需要定义自己的接口,以便彼此之间进行通信。

文章转载自:少年真爱

原文链接:https://www.cnblogs.com/mingnianjiehunba/p/17732881.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/144143.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言中自己实现了一个排序为什么会比 qsort 的速度慢几十倍不止

C语言中自己实现了一个排序&#xff0c;为什么会比 qsort 的速度慢几十倍不止? 讲到算法&#xff0c;有一个非常重要的前置知识叫时间复杂度&#xff0c;脱离了这个讲算法的优劣是没什么意义的。这个概念主要是指&#xff0c;你数据量的增加&#xff0c;会让算法的处理时间增加…

mini型光学3D表面轮廓仪,上车即走,上桌即用!

“小身材&#xff0c;大作用”——一个简单的比喻&#xff0c;恰当地总结了SuperView WM100光学3D表面轮廓仪的特点。mini型光学3D表面轮廓仪SuperView WM100&#xff0c;回应了市场对小型化、便携式光学3D表面轮廓仪的需求。 轻便的机身&#xff0c;简约的设计——没有控制箱…

element el-upload上传功能

2023.11.14今天我学习了如何使用el-upload: <!--drag设置可拖动--><!--accept".xlsx"设置上传的文件类型--><!--:limit1上传文件的最大个数--><!--:auto-upload"false"是否在选取后直接上传--><!--:before-upload"beforeU…

cout的输出整数格式

cout默认以十进制格式显示整数 cout << oct和cout << hex不会显示出来&#xff0c;而只是修改cout显示整数的方式 使用std::hex和std::oct时&#xff0c;可以将hex和oct当做变量名&#xff0c;否则不可以 #include<iostream>int main() {int a;std::cout &l…

高并发场景下,如何设计订单库存架构,一共9个关键性问题

库存系统可以分为实物库存和虚拟库存两种类型。实物库存的管理涉及到采购、存储、销售和库存轮换等复杂的活动&#xff0c;需要进行供应链管理和仓库管理等工作。相比之下&#xff0c;虚拟库存的管理相对简单&#xff0c;主要适用于线上资源的数量管理&#xff0c;包括各类虚拟…

安装部署Esxi7.0并创建虚拟机

1. Esxi介绍 ESXI虚拟平台是VMware出品的一个强大平台&#xff0c;它可以直接安装在物理机上&#xff0c;从而充分利用物理奖性能&#xff0c;虚拟多个系统出来。ESXI是一个带WEB管理后台的软件&#xff0c;非常适合安装在服务器上&#xff0c;然后直接通过网页进行远程管理。…

发布自研大模型 夸克App将迎来全面升级

国产大模型阵营再添新锐选手。11月14日&#xff0c;阿里巴巴智能信息事业群发布全栈自研、千亿级参数的夸克大模型&#xff0c;将应用于通用搜索、医疗健康、教育学习、职场办公等众多场景。夸克App将借助自研大模型全面升级&#xff0c;加速迈向年轻人工作、学习、生活的AI助手…

分享一下微信会员充值管理系统怎么做

在当今数字化时代&#xff0c;微信作为中国最流行的社交平台&#xff0c;其功能已经从简单的沟通交流扩展到了生活的方方面面。微信会员充值管理系统就是其中之一&#xff0c;它为商家提供了一个高效、便捷的充值体验&#xff0c;同时也为用户提供了更加个性化的服务。本文将详…

操作系统——死锁(一文详解死锁,死锁产生的原因和死锁的解决方案)

1、什么是死锁&#xff1f;死锁产生的条件&#xff1f; 1.1、什么是死锁&#xff1f; 答&#xff1a; 在两个或者多个并发进程中&#xff0c;如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源&#xff0c;在未改变这种状态之前都不能向前推进&#xff…

22款奔驰C260L升级小柏林音响 全新15个扬声器 提升音乐效果

奔驰新款C级号称奔驰轿车的小“S”&#xff0c;在配置方面上肯定也不能低的&#xff0c;提了一台低配的车型&#xff0c;通过后期升级加装件配置提升更高档次&#xff0c;打造独一无二的奔驰C级&#xff0c;此次来安排一套小柏林之声音响&#xff0c;效果怎么样&#xff0c;我们…

bclinux aarch64 ceph 14.2.10 对象存储 http网关 CEPH OBJECT GATEWAY Civetweb

相关内容 bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds&#xff1a; ceph-deploy mds-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【3】vdbench fsd 文件系统测试-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设…

独立站邮件营销大佬,手把手教你如何做好!

做独立站邮件营销的方式&#xff1f;独立站怎么做邮件营销&#xff1f; 邮件营销&#xff0c;作为独立站营销的重要手段之一&#xff0c;越来越受到卖家的重视。如何才能做好邮件营销呢&#xff1f;蜂邮EDM将手把手教你如何做好独立站邮件营销&#xff0c;让你在电商领域中更上…

银行转账p图手机软件,实现回执单截图生成,用Swing或JavaFX实现

其实总体用了很少的代码&#xff0c;就是模版图框架代码实现&#xff0c;模版也是网上的&#xff0c;非常多总体实现的原理还是绘图功能&#xff0c;捕捉用户输入。 用户界面 (UI): 我们可以使用Swing或JavaFX来创建一个窗口界面&#xff0c;允许用户输入所需的信息。 数据处理…

Sui上TVL突破1.28亿美金,浅谈DeFi续创新高背后的基础知识

根据财富商业洞察研究&#xff0c;DeFi市场预计从2022年的555.8亿美元增长到2030年的3370.4亿美元。推动这一增长的活动包括对token的交易、借贷和借款&#xff0c;这通常是点对点的&#xff0c;无需传统金融机构的参与。随着Sui网络于今年五月份启动主网和其SUI token&#xf…

MCU常见通信总线串讲(五)—— CAN总线协议

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

【原创】java+swing+mysql车辆维修管理系统设计与实现

摘要&#xff1a; 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统&#xff0c;它能够提高效率&#xff0c;减少错误&#xff0c;并提供详细的车辆历史记录&#xff0c;可以帮助车辆维修企业实现信息化管理&#xff0c;提高工作效率和客户满意度&#xff0c;降低运营…

生成式AI:压缩与加密的新方式

目前围绕生成式AI的大部分讨论都纯粹集中在结果上&#xff1a;你可以与它交谈&#xff0c;你可以生成艺术作品和视频&#xff0c;它可以生成声音。 这些都是非凡的成就。 然而&#xff0c;我相信&#xff0c;如果你以几种方式重新构建生成式AI&#xff0c;你会得到一些非常有趣…

Vatee万腾的数字化掌舵:Vatee科技引领未来的新高度

随着数字化时代的到来&#xff0c;Vatee万腾以其卓越的科技决策力成为引领潮流的掌舵者。 Vatee万腾通过对科技前沿的不懈探索&#xff0c;站在了数字化创新的最前沿。其领先的科技团队致力于发掘并应用最新的数字技术&#xff0c;为用户提供卓越的数字化体验。 Vatee万腾以其…

NR CA bandwidth class

CA配置对应的是Band combination&#xff0c;每个band对应支持的 CA bandwidth class&#xff0c;如下表Table 5.3A.5-1。 BW_channel,max对应的是协议中中规定的最大channel 带宽&#xff0c;FR1 R16对应的就是100MHZ。 如上述黄色字体部分&#xff0c;考虑的是实网下UE上报…

【React】Redux基本使用

什么情况使用 Redux &#xff1f; Redux 适用于多交互、多数据源的场景。简单理解就是复杂 从组件角度去考虑的话&#xff0c;当我们有以下的应用场景时&#xff0c;我们可以尝试采用 Redux 来实现 某个组件的状态需要共享时 一个组件需要改变其他组件的状态时 一个组件需要…