学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。

桥接模式的定义与特点

桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

桥接模式又被称为:柄体(Handle and Body)模式接口(Interfce)模式.

通过上面的讲解,我们能很好的感觉到桥接模式遵循了里氏替换原则依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。这里将桥接模式的优缺点总结如下。

桥接(Bridge)模式的优点是:

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明

桥接(Bridge)模式的缺点是:

  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。

桥接模式的结构与实现

可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。

1. 模式的结构

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

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

其结构图如图 1 所示。

图1

实现的举例代码:

using DesignPattern.BridgePattern;
using System; namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
BridgeHelper();
} #region Pattern - Bridge
static void BridgeHelper()
{
Goods huaweiIPad = new GoodIPad(new Huawei());
huaweiIPad.Info(); Goods lenovoPhone= new GoodPhone(new Lenovo());
lenovoPhone.Info(); Goods appleComputer = new GoodComputer(new Apple());
appleComputer.Info(); Console.ReadLine();
}
#endregion
}
} //====================================================================================== namespace DesignPattern.BridgePattern
{
/// <summary>
/// 品牌接口
/// </summary>
public interface BridgeBrand
{
/// <summary>
/// 具体的品牌信息
/// </summary>
string BrandInfo { get; }
} public class Lenovo : BridgeBrand
{
public string BrandInfo => "联想";
}
public class Apple : BridgeBrand
{
public string BrandInfo => "苹果";
}
public class Huawei : BridgeBrand
{
public string BrandInfo => "华为";
} /// <summary>
/// 产品抽象类
/// </summary>
public abstract class Goods
{
protected BridgeBrand brand; public Goods(BridgeBrand brand)
{
this.brand = brand;
} /// <summary>
/// 产品信息
/// </summary>
public abstract void Info();
} public class GoodIPad : Goods
{
public GoodIPad(BridgeBrand brand) : base(brand)
{
this.brand = brand;
}
public override void Info()
{
Console.WriteLine($"这是 {brand.BrandInfo} 家的 - iPad");
}
}
public class GoodComputer : Goods
{
public GoodComputer(BridgeBrand brand) : base(brand)
{
this.brand = brand;
}
public override void Info()
{
Console.WriteLine($"这是 {brand.BrandInfo} 家的 - Computer");
}
}
public class GoodPhone : Goods
{
public GoodPhone(BridgeBrand brand) : base(brand)
{
this.brand = brand;
}
public override void Info()
{
Console.WriteLine($"这是 {brand.BrandInfo} 家的 - Phone");
}
}
}


希望大家:点赞,留言,关注咯~

唠家常

今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加QQ:841298494,大家一起进步。

  • 客官,看完get之后记得点赞哟!
  • 小伙伴你还想要别的知识?好的呀,分享给你们

今日推荐

结构型模式 - 桥接模式Bridge的更多相关文章

  1. 【设计模式】结构型04桥接模式(Bridge Pattern)

    学习地址:http://www.runoob.com/design-pattern/bridge-pattern.html 桥接模式(Bridge Pattern) 桥接模式(Bridge patte ...

  2. 【结构型】Flyweight模式

    享元模式的主要目的.意图是为对象的大量使用提供一种共享机制.该模式的思想重在复用.共享复用.像文字.列表中的格子等这类多数都是需要考虑复用技术,否则必将大量耗费内存空间而使资源以及性能等大量耗费.该模 ...

  3. python设计模式---结构型之代理模式

    主要想着nginx:) from abc import ABCMeta, abstractmethod # 结构型设计模式---代理模式 class Actor: def __init__(self) ...

  4. java设计模式--结构型模式--桥接模式

    桥接模式 概述 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 1.你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或 ...

  5. [19/04/26-星期五] GOF23_结构型模式(桥接模式、组合模式)

    一.桥接模式(bridge) 场景:商城系统中常见的商品分类,以电脑为例,首先想到使用多层继承结构. —— 台式机(联想台式机.戴尔台式机.神舟台式机) 电脑    ——笔记本(联想笔记本.戴尔笔记本 ...

  6. 【设计模式】结构型03外观模式(Facade Pattern)

    [设计模式]结构型02装饰模式(Decorator Pattern) 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 主要解决:降低访问 ...

  7. JAVA设计模式 5【结构型】代理模式的理解与使用

    今天要开始我们结构型 设计模式的学习,设计模式源于生活,还是希望能通过生活中的一些小栗子去理解学习它,而不是为了学习而学习这些东西. 结构型设计模式 结构型设计模式又分为 类 结构型 对象 结构型 前 ...

  8. VMWare提供三种工作模式桥接(bridge)、NAT(网络地址转换)和host-only(主机模式)

    1.桥接模式 在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和虚拟机处于对等地位),它可以访问网内任何一台机器.在桥接模式下,我们往往需要为虚拟主机配置IP地址.子网 ...

  9. 提高C++编译速度-------pimpl 模式& 桥接模式(转)

    pimpl 模式(Private Implementation),我们常常听到诸如“不要改动你的公有接口”这样的建议,所以我们一般都会修改私有接口,但是这会导致包含该头文件的所有源文件都要重新编译,这 ...

  10. VMware网络连接模式——桥接模式、NAT模式以及仅主机模式的介绍和区别

    在使用VMware Workstation(以下简称:VMware)创建虚拟机的过程中,配置虚拟机的网络连接是非常重要的一环,当我们为虚拟机配置网络连接时,我们可以看到如下图所示的几种网络连接模式:桥 ...

随机推荐

  1. Aspose.Cell篇章3,设置写入到Excel文件的各种样式及输出

    Aspose.Cell的Style.Number设置全部设置 /// <summary> /// 单元格样式编号 /// 0 General General /// 1 Decimal 0 ...

  2. The Google File System 翻译和理解

    The Google File System 摘要 GFS 是一个可扩展的分布式文件系统,用于大型分布式数据密集型应用上.它可以运行在便宜的普通硬件上,提供了高性能和一定的容错性. 1. 分布式文件系 ...

  3. 重大发现,AQS加锁机制竟然跟Synchronized有惊人的相似

    在并发多线程的情况下,为了保证数据安全性,一般我们会对数据进行加锁,通常使用Synchronized或者ReentrantLock同步锁.Synchronized是基于JVM实现,而Reentrant ...

  4. Vue3组件间传值

    12种方式 1. 父组件 ./father.vue 点击查看代码 <template> <h1>father:</h1> <h3>子组件传过来的:{{ ...

  5. Redis系列11:内存淘汰策略

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  6. i春秋exec

    打开是一个gif,提示文字未登录 话不多说,查看源码 发现vim字样,可能是文件泄露 直接在url后加/.index.php.swp来下载泄露文件 下载好了之后放vm上使用vim -r  .index ...

  7. i春秋Zone

    打开网页是个简单的表单填写, 尝试注入....没用 查看源码,没找到什么有用的信息 只有抓包了 发现一个cookie的login值为0,改为1试试 没什么特别的回显,但这应该就是登录与否的判定了,所以 ...

  8. Fastjsonfan反序列化(一)

    前置知识 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象. Fastjson 可以操作任何 Java 对象 ...

  9. SSH(一)架包的引入

    一年多未使用了,有些东西真的会忘. 一.ssh的图形化记忆运作流程 二.Struts2.hibernate.spring需要引用的jar包 Struts2: 基本开发:struts-2.3.32\ap ...

  10. whylogs工具库的工业实践!机器学习模型流程与效果监控 ⛵

    作者:韩信子@ShowMeAI 机器学习实战系列:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/artic ...