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)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初始桥接模式 ...
随机推荐
- error:docker-ce conflicts with 2:docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64
问题原因:安装docker之前有安装cockpit-docker服务 解决方法:卸载docker-ce [root@localhost ~]# yum list installed | grep do ...
- Linux系统搭建Hadoop集群
一.环境说明 IP地址 主机名 备注 操作系统 192.168.92.11 hserver1 namenode Ubuntu 16.04 192.168.92.12 hserver2 datanode ...
- Java学习的第九天
1.双色球联系: 对象的创建和使用 2.静态没太明白. 3.明天学习java 的方法
- Day13 CSS样式
1. css 选择器 1.1 css三种引入方法 <!DOCTYPE HTML> <html> <head> <meta charset="utf- ...
- 模板——Splay
$Splay$ #include <bits/stdc++.h> #define inf (int)1e9 using namespace std; const int N=1e5+100 ...
- 5、Django之模板层
一 模板简介 在刚刚介绍完的视图层中我们提到,浏览器发送的请求信息会转发给视图函数进行处理,而视图函数在经过一系列处理后必须要有返回信息给浏览器.如果我们要返回html标签.css等数据给浏览器进行渲 ...
- IAuthorizationFilter学习笔记(权限控制)以及非全局的filter
第一步:新建类CheckLoginFilter实现接口IAuthorizationFilter.请注意接口位于命名空间using System.Web.Mvc; public void OnAutho ...
- openWRT编译报错集锦
需网络稳定,可正常上梯子. /*ubuntu18编译报错:*/ autoreconf: running: /home/jack/openwrt-sdk/staging_dir/host/bin/aut ...
- 19Jinja2中宏定义
1 @app.route('/') 2 def hello_world(): 3 return render_template('index.html') 4 5 6 {% macro input(n ...
- 浮动布局问题多,还是用inline-block吧
说说知识陈旧的问题. 目前我的前端开发知识积累最大的问题就是版本问题,也许我已经经历了很多,尝试了很多, 但是有些知识的版本已经过时了,而我还没有来得及更新它们.更悲剧的可能是有些部分我还没有意识到. ...