【设计模式】C#实现桥接模式

简介: 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

【设计模式】桥接模式

1、概述

背景

桥接模型.png

我们在做一个大事件的时候,会把它分解成各个中事件,然后再把中事件分解成小事件。当我们完成各个小事件的时候,大事件自然就完成了。也就是是高层模块(大事件)应该依赖于底层模块(小事件)。

依赖倒置原则

依赖倒置原则指的是高层模块(稳定)不应该依赖于底层模块(变化),二者都应该依赖于抽象(稳定)。抽象(稳定)不应该依赖于实现(变化),实现应该依赖于抽象(稳定)。

举个例子,现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系如下图:

依赖倒置.png

从图中我们可以很直观地看出箭头反转了,这就是依赖倒置原则的应用了。

但是,我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。

试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。

定义

将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

结构

桥接(Bridge)模式包含以下主要角色:

  • 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

2、实现思路

场景

需要开发一个电脑售卖平台,可以售卖不同名牌(华硕、戴尔、联想)的不同类型电脑(台式、笔记本)。该平台包含了两个维度,适合使用桥接模式。

    /// <summary>
    /// 名牌
    /// </summary>
    public interface IBrand
    {
        public void BrandDecision();
    }

    /// <summary>
    /// 戴尔
    /// </summary>
    public class Dell : IBrand
    {
        public void BrandDecision()
        {
            Console.WriteLine("戴尔品牌");
        }
    }
    
    /// <summary>
    /// 联想
    /// </summary>
    public class Lenovo : IBrand
    {
        public void BrandDecision()
        {
            Console.WriteLine("联想品牌");
        }
     } 

    /// <summary>
    /// 种类
    /// </summary>
    public interface IVariety
    {
        public void ReadMe();
    }

    /// <summary>
    /// 台式机
    /// </summary>
    public class Desktop : IVariety
    {
        public void ReadMe()
        {
            Console.WriteLine("台式机");
        }
    }

    /// <summary>
    /// 笔记本
    /// </summary>
    public class Laptop : IVariety
    {
        public void ReadMe()
        {
            Console.WriteLine("笔记本");
        }
    }

    public class Computer
    {
        private IBrand _brand = null;
        private IVariety _variety = null;

        public Computer(IBrand brand, IVariety variety)
        {
            this._brand = brand;
            this._variety = variety;
        }

        public void StartUp()
        {
            this._brand.BrandDecision();
            this._variety.ReadMe();
            Console.WriteLine($"{this._brand.GetType().Name}的{this._variety.GetType().Name}开机");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IBrand dell = new Dell();
            IBrand asus = new ASUS();
            IBrand lenovo = new Lenovo();

            IVariety desktop = new Desktop();
            IVariety laptop = new Laptop();

            Computer computer = new Computer(dell,desktop);
            computer.StartUp();

            Computer computer1 = new Computer(asus, desktop);
            computer1.StartUp();

            Computer computer2 = new Computer(lenovo, laptop);
            computer2.StartUp();
        }
    }

============================================
戴尔品牌
台式机
Dell的Desktop开机
华硕品牌
台式机
ASUS的Desktop开机
联想品牌
笔记本
Lenovo的Laptop开机

我们可以看出品牌都依赖于一个接口,种类也依赖于接口,这是依赖倒置的一种体现。我们将两个接口通过Computer类连接了起来,就像一座桥。如果现在还有一种新的品牌,我们只需要再定义一个类实现IBrand接口即可,其他类不需要发生变化,这也遵守了开闭原则。

3、优缺点

优点
  • 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
  • 实现细节对客户透明

4 、使用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
相关文章
|
2月前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
2月前
|
设计模式 安全 Java
C# 一分钟浅谈:设计模式之单例模式
【10月更文挑战第9天】单例模式是软件开发中最常用的设计模式之一,旨在确保一个类只有一个实例,并提供一个全局访问点。本文介绍了单例模式的基本概念、实现方式(包括饿汉式、懒汉式和使用 `Lazy&lt;T&gt;` 的方法)、常见问题(如多线程和序列化问题)及其解决方案,并通过代码示例详细说明了这些内容。希望本文能帮助你在实际开发中更好地应用单例模式,提高代码质量和可维护性。
57 1
|
3月前
|
设计模式 自然语言处理 算法
PHP中的设计模式:桥接模式的深入探索与应用
在PHP开发中,理解并运用设计模式是提升代码质量与可维护性的关键。本文聚焦于桥接模式——一种结构型设计模式,它通过封装一个抽象的接口,将实现与抽象分离,从而使得它们可以独立变化。不同于传统摘要的概述式表述,本文将以故事化的情境引入,逐步解析桥接模式的精髓,通过PHP代码示例详细展示其在实际项目中的应用,旨在为读者提供一个既深刻又易于理解的学习体验。
29 1
|
3月前
|
设计模式 Java
Java设计模式-桥接模式(9)
Java设计模式-桥接模式(9)
|
2月前
|
设计模式 Java
Java设计模式之桥接模式
这篇文章介绍了Java设计模式中的桥接模式,包括桥接模式的目的、实现方式,并通过具体代码示例展示了如何分离抽象与实现,使得两者可以独立变化。
47 0
|
4月前
|
设计模式 XML 存储
【七】设计模式~~~结构型模式~~~桥接模式(Java)
文章详细介绍了桥接模式(Bridge Pattern),这是一种对象结构型模式,用于将抽象部分与实现部分分离,使它们可以独立地变化。通过实际的软件开发案例,如跨平台视频播放器的设计,文章阐述了桥接模式的动机、定义、结构、优点、缺点以及适用场景,并提供了完整的代码实现和测试结果。桥接模式适用于存在两个独立变化维度的系统,可以提高系统的可扩展性和灵活性。
【七】设计模式~~~结构型模式~~~桥接模式(Java)
|
3月前
|
设计模式 C# 开发者
C#设计模式入门实战教程
C#设计模式入门实战教程
|
4月前
|
设计模式 算法 C#
C#设计模式之策略模式
C#设计模式之策略模式
88 19
|
4月前
|
设计模式 安全 程序员
C#设计模式之单例模式
C#设计模式之单例模式
52 3
|
4月前
|
设计模式 缓存 项目管理
设计模式的基础问题之桥接模式在软件开发应用的问题如何解决
设计模式的基础问题之桥接模式在软件开发应用的问题如何解决