引言

例如我有好几个项目,需要外包出去做各种类型的测试,不同的公司基础费用不同,不同的测试类型价格也是不同的。此时不同的项目选择不同的公司和不同类型的测试进行测试价格都是不同的。于是我们可以创建一个项目抽象类,一个公司抽象类,一个测试类型抽象类,然后实现各自的具体类,不同的项目使用不同的公司和测试类型,进行测试。抽象化与实现化解耦,二者可以独立变化。我们将这种通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦的类型称为桥接模式。

概念

桥接(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)的更多相关文章

  1. 转:设计模式-----桥接模式(Bridge Pattern)

    转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...

  2. C#设计模式——桥接模式(Bridge Pattern)

    一.概述在软件开发中,我们有时候会遇上一个对象具有多个变化维度.比如对汽车对象来说,可能存在不同的汽车类型,如公共汽车.轿车等,也可能存在不同的发动机,如汽油发动机.柴油发动机等.对这类对象,可应用桥 ...

  3. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  4. 【设计模式】桥接模式 Bridge Pattern

    开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...

  5. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

  6. 二十四种设计模式:桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...

  7. 桥接模式(Bridge Pattern)

    1,定义           桥接模式(Bridge Pattern),也称为桥梁模式,其用意是将抽象化与实现化脱耦,使得两者可以独立的变化,它可以使软件系统沿着多个方向进行变化,而又不引入额外的复杂 ...

  8. Net设计模式实例之桥接模式( Bridge Pattern)

    一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...

  9. 七个结构模式之桥接模式(Bridge Pattern)

    问题: 当存在多个独立的变化维度时,如果仍采用多层继承结构,会急剧的增加类的个数,因此可以考虑将各个维度分类,使他们不相互影响. 定义: 将抽象部分与它的实现部分进行分离,抽象部分只保留最为本质的部分 ...

  10. 设计模式 -- 桥接模式(Bridge)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初始桥接模式 ...

随机推荐

  1. 常用的实现Javaweb页面跳转的方式

    我们有两大种方式来实现页面跳转:1.JS(javascript):2.jsp跳转 先说jsp(金j三s胖p):1.转发:request.getRequestDispatcher("1.jsp ...

  2. 循序渐进VUE+Element 前端应用开发(24)--- 修改密码的前端界面和ABP后端设置处理

    用户在系统登录后,一般会提供一个入口给当前用户更改当前的密码,其实更改密码操作是很简单的一个处理,不过本篇随笔主要是介绍结合前后端来实现这个操作,后端是基于ABP框架的,需要对密码的安全性进行一个设置 ...

  3. 世界碰撞算法原理和总结(sat gjk)

    序言 此文出于作者的想法,从各处文章和论文中,总结和设计项目中碰撞结构处理方法.如有其它见解,可以跟作者商讨.(杨子剑,zijian_yang@yeah.net). 在一个世界中,有多个物体,物体可以 ...

  4. 01.axios封装

    1. 始vue化项目 https://www.cnblogs.com/xiaonq/p/11027880.html   vue init webpack deaxios # 使用脚手架创建项目 dea ...

  5. LRU算法详解

    一.什么是 LRU 算法 就是一种缓存淘汰策略. 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置.但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留 ...

  6. Linux下开发环境的搭建(For C++ OIer)

    说句实话,对于OIer来说,Linux真的是个很好的开发平台. 这里既没有游戏的喧嚣,也没有广告的打扰,gcc/g++早已预装,一切已为你准备好......(???)即使对于日常使用,也绰绰有余. 如 ...

  7. How to using expression setup BackgroundColor AX2012 SSRS Report[AX2012]

    tile label using [#99ccff] property BackgroundColor - > expression =Iif(Fields!Flag.Value = " ...

  8. 14、Cookie和Session组件

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  9. 双十一,就用turtle画个单身狗送给自己

    今年的双十一到了 但还有谁记得双十一是 单身狗的节日 单身狗的我是时候站出来 捍卫自己的权益了 单身是一种怎样的状态? 我们所有人都单身过,但也许只有很少的人真正体验过. 短视频内容完全是假的,全程是 ...

  10. 使用arm-none-eabi-gdb报错error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory

    使用arm-none-eabi-gdb报错error while loading shared libraries: libncurses.so.5: cannot open shared objec ...