桥接模式(Bridge Pattern)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/401 访问。

桥接模式属于结构型模式,它将抽象部分与它的实现部分分离,使它们都可以相互独立地变化。

利用面向对象的技术来使得某类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度,这就是桥接模式的核心意义。

角色:

1、抽象(Abstraction)

定义抽象接口,该接口中包含实现具体行为、具体特征的Implementor接口;

2、扩充抽象(Refined Abstraction)

继承自Abstraction的子类,依旧是一个抽象的事物名;

3、实现(Implementor)

定义具体行为,具体特征的应用接口;

4、具体实现(ConcreteImplementor)

Implementor的具体实现。

示例:

命名空间BridgePattern中包含电视机基类,3个具体电视机类,一个遥控器基类和1个具体遥控器类。本案例尝试使用桥接模式来解决如何用遥控器来遥控不同的电视机完成相应的动作。

namespace BridgePattern
public abstract class Television {

    public abstract void TurnOn();

    public abstract void TurnOff();

    public abstract void TurnChannel();

}

电视机基Television类,包含打开电视TurnOn、关闭电视TurnOff、换台功能TurnChannel。

public class Konka : Television {

    public override void TurnOn() {
Console.WriteLine("Turn on Konka!");
} public override void TurnOff() {
Console.WriteLine("Turn off Konka!");
} public override void TurnChannel() {
Console.WriteLine("Turn channel Konka!");
} }

具体电视类,康佳Konka类。

public class Lenovo : Television {

    public override void TurnOn() {
Console.WriteLine("Turn on Lenovo!");
} public override void TurnOff() {
Console.WriteLine("Turn off Lenovo!");
} public override void TurnChannel() {
Console.WriteLine("Turn channel Lenovo!");
} }

具体电视类,联想Lenovo类。

public class Panasonic : Television {

    public override void TurnOn() {
Console.WriteLine("Turn on Panasonic!");
} public override void TurnOff() {
Console.WriteLine("Turn off Panasonic!");
} public override void TurnChannel() {
Console.WriteLine("Turn channel Panasonic!");
} }

具体电视类,松下Panasonic类。

public class TeleControllerBase {

    public Television Television { get; set; }

    public virtual void TurnOn() {
Television.TurnOn();
} public virtual void TurnOff() {
Television.TurnOff();
} public virtual void TurnChannel() {
Television.TurnChannel();
} }

遥控器基类TeleControllerBase类,内部维持一个电视机基类的引用,并包含对应的3个电视机功能。

public class TeleController : TeleControllerBase {

    public override void TurnOff() {
base.TurnOff();
Console.WriteLine("-------------------------");
} }

具体遥控器TeleController类。

public class Program {

    private static TeleControllerBase _teleController = null;

    public static void Main(string[] args) {
_teleController = new TeleController(); _teleController.Television = new Konka();
_teleController.TurnOn();
_teleController.TurnChannel();
_teleController.TurnOff(); _teleController.Television = new Lenovo();
_teleController.TurnOn();
_teleController.TurnChannel();
_teleController.TurnOff(); _teleController.Television = new Panasonic();
_teleController.TurnOn();
_teleController.TurnChannel();
_teleController.TurnOff(); Console.ReadKey();
} }

以上是调用方的代码,以下是这个案例的输出结果:

Turn on Konka!
Turn channel Konka!
Turn off Konka!
-------------------------
Turn on Lenovo!
Turn channel Lenovo!
Turn off Lenovo!
-------------------------
Turn on Panasonic!
Turn channel Panasonic!
Turn off Panasonic!
-------------------------

优点:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/401 访问。

1、抽象和实现的分离;

2、优秀的扩展能力;

3、实现细节对客户透明。

缺点:

1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

使用场景:

1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系;

2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用;

3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

C#设计模式之7-桥接模式的更多相关文章

  1. Java设计模式之《桥接模式》及应用场景

    摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...

  2. 实例解析Python设计模式编程之桥接模式的运用

    实例解析Python设计模式编程之桥接模式的运用 这篇文章主要介绍了Python设计模式编程之桥接模式的运用,桥接模式主张把抽象部分与它的实现部分分离,需要的朋友可以参考下 我们先来看一个例子: #e ...

  3. java23种设计模式——七、桥接模式

    原文地址:https://www.cnblogs.com/chenssy/p/3317866.html 源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 j ...

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

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

  5. [设计模式] javascript 之 桥接模式

    桥接模式说明 定义:分离抽象化与实现化,使之可以自由独立的变化: 说明:由于软件环境需求原因,使得类型抽象具有多种实现以自身变化定义等情况,这使得我们要分离抽象实现与具体实现,使得抽象化与实现化解耦, ...

  6. 设计模式学习之桥接模式(Bridge,结构型模式)(15)

    参考地址:http://terrylee.cnblogs.com/archive/2006/02/24/336652.html 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化, ...

  7. 【读书笔记】读《JavaScript设计模式》之桥接模式

    桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化. 一.使用场景 使用场景一:事件监控 对于前端而言,最典型的使用场景——事件监控.如—— addEvent(element ...

  8. Java设计模式系列之桥接模式

    桥接模式(Bridge)的定义 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地 ...

  9. java设计模式-----14、桥接模式

    Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstraction ...

  10. 设计模式学习心得<桥接模式 Bridge>

    说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...

随机推荐

  1. 三种安装python第三方库的方法

    ​    还记得第一天的时候我们说python拥有丰富的库,那这么多的第三方库,我们如何使用呢?今天我们可以看一下python库的安装. 方法一:使用python命令进行离线安装 我以urllib5库 ...

  2. J.U.C体系进阶(二):juc-locks 锁框架

    Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-locks 锁框架 接口说明 Lock接口 类型 名称 void loc ...

  3. 第六章:Android的Drawable

    Drawable表示的是一种可以在Canvas上进行绘制的抽象的概念. 6.1 Drawable简介 Drawable常被用来作为View的背景使用. Drawable一般都是通过XML来定义的. D ...

  4. LGTB 与 序列

    题目描述 LGTB 有一个长度为 N 的序列 A ,现在他想构造一个新的长度为 N 的序列 B ,使得 B 中的任意两个数都互质.并且他要使 \sum_{1\le i\le N}|A_i-B_i| 最 ...

  5. Go的100天之旅-08字符串

    目录 简介 UTF-8字符 字符串的常用操作 简介 字符串在各种编程语言中都是很基础的一种类型,在Go中字符串简单理解就是一个数组,数组里面的元素是byte类型.因此基本上拥有类似数组的全部特性.例如 ...

  6. echarts 实战 : 图表竖着或横着是怎样判定的?

    这个问题比较简单. echarts 的图表默认是竖着的. 只要 xAxis 和 yAxis 互换,竖着的图就变成了横着的图了. 所以我们可以可以写一个xy轴互换的方法. reverseXYAxis = ...

  7. 占个坑 未来学qt的时候专用

    今天看了一个大佬发了一个上位机图片便向大佬问道 ”上位机是用什么软件做的“大佬抛下一句qt ,在业界内很通用,windows和linux通吃,便让我萌生了一个想法,去学qt.虽说上位机时常听到,但是自 ...

  8. 解决用vscode开发arduino时Serial未定义

    在工作目录编辑c_cpp_properties.json文件 添加defines字段 { "configurations": [ { "name": " ...

  9. 贪心法-------Saruman's army

    此题的策略是选取可用范围最右边的点,一般来说该点辐射两边,左侧辐射,右侧辐射,所以用两个循环,第一个循环找出该点,第二个循环求出最右边的点 源代码: #include<iostream># ...

  10. Centos 7下编译安装Nginx

    一.下载源代码 百度云网盘下载地址:https://pan.baidu.com/s/19MQODvofRNnLV9hdAT-R6w 提取码:zi0u 二.安装依赖及插件 yum -y install ...