C#设计模式-桥接模式(Bridge Pattern)
引言
例如我有好几个项目,需要外包出去做各种类型的测试,不同的公司基础费用不同,不同的测试类型价格也是不同的。此时不同的项目选择不同的公司和不同类型的测试进行测试价格都是不同的。于是我们可以创建一个项目抽象类,一个公司抽象类,一个测试类型抽象类,然后实现各自的具体类,不同的项目使用不同的公司和测试类型,进行测试。抽象化与实现化解耦,二者可以独立变化。我们将这种通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦的类型称为桥接模式。
概念
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
结构图

桥接(Bridge)模式中的主要角色:
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
具体实现
以引言中的示例进行实现。一个产品需要外包出去进行测试。
涉及三个角色:产品、外包公司、测试类型
using System; namespace Bridge
{
class Program
{
static void Main(string[] args)
{
Company beijingCompany = new BeijingCompany();
TestType manualTest = new ManualTest();
Prodeuct managementProdeuct = new ManagementProdeuct(beijingCompany, manualTest);
managementProdeuct.Run(); Company shanghaiCompany = new ShanghaiCompany();
TestType autoTest = new AutoTest();
Prodeuct operationProdeuct = new ManagementProdeuct(shanghaiCompany, autoTest);
operationProdeuct.Run(); Console.Read();
}
} /// <summary>
/// 软件产品,抽象类
/// 充当抽象化角色
/// 将抽象部分与实现部分分离,使他们都可以独立的变化
/// </summary>
public abstract class Prodeuct
{
private readonly Company _company;
private readonly TestType _testType; // 使用组合,一个产品外包出去,需要一个公司进行不同测试类型的测试
public Prodeuct(Company company, TestType testType)
{
this._company = company;
this._testType = testType;
} public string Name { get; set; } // 执行实现部分
public void Run()
{
Console.WriteLine($"{this._company.Name}对产品{Name}进行{this._testType.Name},总共花费时间{this._company.BaseTime + this._testType.RunTime}。");
Console.WriteLine("======================================================");
} } /// <summary>
/// 公司,对实现部分进行抽象
/// </summary>
public abstract class Company
{
public string Name { get; set; } public Double BaseTime { get; set; } } /// <summary>
/// 测试类型,对实现部分进行抽象
/// </summary>
public abstract class TestType
{
public string Name { get; set; } public Double RunTime { get; set; } } /// <summary>
/// 管理系统,扩展抽象化角色
/// </summary>
public class ManagementProdeuct : Prodeuct
{ public ManagementProdeuct(Company company, TestType testType) : base(company, testType)
{
Name = "管理系统";
}
} /// <summary>
/// 运营系统,扩展抽象化角色
/// </summary>
public class OperationProdeuct : Prodeuct
{ public OperationProdeuct(Company company, TestType testType) : base(company, testType)
{
Name = "运营系统";
}
} /// <summary>
/// 公司抽象类具体实现,具体实现化角色
/// </summary>
public class BeijingCompany : Company
{
public BeijingCompany()
{
Name = "北京公司";
BaseTime = 200;
}
} /// <summary>
/// 公司抽象类具体实现,具体实现化角色
/// </summary>
public class ShanghaiCompany : Company
{
public ShanghaiCompany()
{
Name = "上海公司";
BaseTime = 100;
}
} /// <summary>
///测试类型抽象类具体实现,具体实现化角色
/// </summary>
public class ManualTest : TestType
{
public ManualTest()
{
Name = "手工测试";
RunTime = 30;
}
} /// <summary>
///测试类型抽象类具体实现,具体实现化角色
/// </summary>
public class AutoTest : TestType
{
public AutoTest()
{
Name = "自动测试";
RunTime = 10;
}
}
}
运行后结果:
北京公司对产品管理系统进行手工测试,总共花费时间230。
======================================================
上海公司对产品管理系统进行自动测试,总共花费时间110。
======================================================
适用场景
- “抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
- 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
- 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
优缺点
优点
- 抽象与实现分离,扩展能力强。
- 符合开闭原则。
- 符合合成复用原则。
- 单一职责原则。 抽象部分专注于处理高层逻辑, 实现部分处理平台细节。
缺点
- 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。
与装饰器模式区别
- 装饰器模式是为了动态地给一个对象增加功能,而桥接模式时为了让类在多个维度上自由扩展。
- 装饰器模式的装饰者和被装饰者需要继承自同一父类,而桥接模式通常不需要;
- 装饰器模式通常可以嵌套使用,而桥接模式不能。
C#设计模式-桥接模式(Bridge Pattern)的更多相关文章
- 转:设计模式-----桥接模式(Bridge Pattern)
转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...
- C#设计模式——桥接模式(Bridge Pattern)
一.概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度.比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车.轿车等,也可能存在不同的发动机,如汽油发动机.柴油发动机等.对这类对象,可应用桥 ...
- 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)
原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...
- 【设计模式】桥接模式 Bridge Pattern
开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...
- python 设计模式之桥接模式 Bridge Pattern
#写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...
- 二十四种设计模式:桥接模式(Bridge Pattern)
桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...
- 桥接模式(Bridge Pattern)
1,定义 桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...
- Net设计模式实例之桥接模式( Bridge Pattern)
一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...
- 七个结构模式之桥接模式(Bridge Pattern)
问题: 当存在多个独立的变化维度时,如果仍采用多层继承结构,会急剧的增加类的个数,因此可以考虑将各个维度分类,使他们不相互影响. 定义: 将抽象部分与它的实现部分进行分离,抽象部分只保留最为本质的部分 ...
- 设计模式 -- 桥接模式(Bridge)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初始桥接模式 ...
随机推荐
- Cloudera Manager简介
Hadoop家族 整个Hadoop家族由以下几个子项目组成: Hadoop Common: Hadoop体系最底层的一个模块,为Hadoop各子项目提供各 种工具,如:配置文件和日志操作等. HDFS ...
- 04 . Go+Vue开发一个线上外卖应用(用户名密码和图形验证码)
图形化验证码生成和验证 功能介绍 在使用用户名和密码登录功能时,需要填写验证码,验证码是以图形化的方式进行获取和展示的. 验证码使用原理 验证码的使用流程和原理为:在服务器端负责生成图形化验证码,并以 ...
- python爬虫04 Requests
接下来我们要来玩一个新的库 这个库的名称叫做 Requests 这个库比我们上次说的 urllib 可是要牛逼一丢丢的 毕竟 Requests 是在 urllib 的基础上搞出来的 通过它我们可以用更 ...
- youtube-dl 源码看看,例子是下载网页
1, 跑起来 下载 youtube-dl, 配合 launch.json, # 本文中 himala 是代指,具体见文末的 github repo "configurations" ...
- 知识全聚集 .Net Core 技术突破 | 简单说说工作单元
知识全聚集 .Net Core 技术突破 | 简单说说工作单元 教程 01 | 模块化方案一 02 | 模块化方案二 其他教程预览 分库分表项目实战教程 Git地址: https://github.c ...
- C# type对象
新建控制台应用程序 新建一个类 class MyClass { private int id; private int age; public int numb; public string Name ...
- ubuntu mplayer "无法打开 VDPAU backend libvdpau ..."
gnome mplayer 报错"无法打开 VDPAU backend libvdpau_nvidia.so: cannot open shared object file: No such ...
- 第05组 Alpha冲刺 (1/6)
.th1 { font-family: 黑体; font-size: 25px; color: rgba(0, 0, 255, 1) } #ka { margin-top: 50px } .aaa11 ...
- http代理阅读4 响应缓存处理
if (c->read->ready) { ngx_http_upstream_process_header(r, u); //读事件触发 准备处理http头部信息 return; } 向 ...
- Go 语言设计哲学之四:项目布局-你如何设计项目结构
在多年的 Go 语言实践积累后逐渐形成了一种典型项目结构,如下图所示: 上面就是一个支持构建二进制可执行文件(在 src 下)的典型 Go 项目的结构. 1 src 目录: 存放项目要编译构建的可执行 ...