设计模式(C#)——06桥接模式
推荐阅读:
在早先,几乎每个手机的充电器接口都是不同的。每个型号的手机都有一个充电器,此时我们把充电器作为一个抽象类,抽象类中提供充电器的所有实现,其他具体手机品牌的充电器都继承这个抽象类。这样的实现使得每部不同型号的手机都由自己充电器实现,这样的设计对于手机的改变可以很好地应对,只需要添加一个派生类(充电器)就搞定了,但随着时间的推移,为了方便统一,研究者希望每种牌子的手机充电器能统一。这就是我们今天要介绍的桥接模式。
桥接模式
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
桥接模式要素:
(1)抽象化角色:使用实现者角色提供的接口来定义基本功能接口,持有实现者角色,并在功能接口中委托给它,起到搭建桥梁的作用;。(注意,抽象化角色并不是指它就是一个抽象类,而是指抽象了实现。)
(2)改善后的抽象化角色:作为抽象化角色的子类,增加新的功能,也就是增加新的接口(方法);与其构成类的功能层次结构;
(3)实现者角色:提供了用于抽象化角色的接口;它是一个抽象类或者接口。
(4)具体的实现者角色:作为实现者角色的子类,通过实现具体方法来实现接口;与其构成类的实现层次结构。
下面针对上面的手机充电器例子,使用代码来帮助大家理解桥接模式:
命名空间桥接模式,包含抽象化角色,改善后的抽象化角色,实现者角色,具体的实现者角色
1.创建抽象化角色Charger
/// <summary>
/// 抽象概念中的充电器,扮演抽象化角色
/// </summary>
public class Charger
{
// 字段
private Phone implementor;
// 属性
public Phone Implementor
{
get { return implementor; }
set { implementor = value; }
}
/// <summary>
/// 电压,这里抽象类中不再提供实现了,而是调用实现类中的实现
/// </summary>
public virtual void Voltage()
{
implementor.Voltage();
}
/// <summary>
/// 接口形状
/// </summary>
public virtual void Shape()
{
implementor.Shape();
}
}
2.改善后的抽象化角色
/// <summary>
/// 具体充电器
/// </summary>
public class ConcreteCharger : Charger
{
public override void Voltage()
{
Console.WriteLine("---------------------");
base.Voltage();
}
}
3.实现者角色
/// <summary>
/// 手机,提供抽象方法
/// </summary>
public abstract class Phone
{
public abstract void Voltage();
public abstract void Shape();
}
4具体的实现者角色
// <summary>
/// 小米手机,重写基类的抽象方法
/// 提供具体的实现
/// </summary>
public class XiaoMi : Phone
{
public override void Voltage()
{
Console.WriteLine("小米牌手机充电器电压");
}
public override void Shape()
{
Console.WriteLine("小米牌手机充电器接口形状");
}
}
/// <summary>
/// 华为手机,重写基类的抽象方法
/// </summary>
public class HuaWei :Phone
{
public override void Voltage()
{
Console.WriteLine("华为牌手机充电器电压");
}
public override void Shape()
{
Console.WriteLine("华为牌手机充电器接口形状");
}
}
5.使用桥接模式
/// <summary>
/// 以电视机遥控器的例子来演示桥接模式
/// </summary>
class Client
{
static void Main(string[] args)
{
// 创建一个充电器
Charger charger = new Charger();
// 小米手机
charger .Implementor = new XiaoMi();
charger .Voltage();
charger .Shape();
Console.WriteLine();
// 华为手机
charger .Implementor = new HuaWei();
charger .Voltage();
charger .Shape();
Console.Read();
}
}
上面桥接模式的实现中,充电器的功能实现方法不在充电器抽象类中去实现,而是把实现部分用另一个手机类去封装它,然而充电器中只包含手机类的一个引用,同时这样的设计也非常符合现实生活中的情况。通过桥接模式,我们把抽象化和实现化部分分离开了,这样就可以很好应对这两方面的变化了。
设计模式(C#)——06桥接模式的更多相关文章
- Java设计模式之《桥接模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...
- 实例解析Python设计模式编程之桥接模式的运用
实例解析Python设计模式编程之桥接模式的运用 这篇文章主要介绍了Python设计模式编程之桥接模式的运用,桥接模式主张把抽象部分与它的实现部分分离,需要的朋友可以参考下 我们先来看一个例子: #e ...
- java23种设计模式——七、桥接模式
原文地址:https://www.cnblogs.com/chenssy/p/3317866.html 源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 j ...
- Net设计模式实例之桥接模式( Bridge Pattern)
一.桥接模式简介(Brief Introduction) 桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化. Decouple an abstra ...
- [设计模式] javascript 之 桥接模式
桥接模式说明 定义:分离抽象化与实现化,使之可以自由独立的变化: 说明:由于软件环境需求原因,使得类型抽象具有多种实现以自身变化定义等情况,这使得我们要分离抽象实现与具体实现,使得抽象化与实现化解耦, ...
- 设计模式学习之桥接模式(Bridge,结构型模式)(15)
参考地址:http://terrylee.cnblogs.com/archive/2006/02/24/336652.html 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化, ...
- 【读书笔记】读《JavaScript设计模式》之桥接模式
桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化. 一.使用场景 使用场景一:事件监控 对于前端而言,最典型的使用场景——事件监控.如—— addEvent(element ...
- Java设计模式系列之桥接模式
桥接模式(Bridge)的定义 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地 ...
- java设计模式-----14、桥接模式
Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstraction ...
随机推荐
- .NET Core CSharp初级篇 1-6 类的多态与继承
.NET Core CSharp初级篇 1-6 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容 ...
- 头部姿态估计 - OpenCV/Dlib/Ceres
基本思想 通过Dlib获得当前人脸的特征点,然后通过旋转平移标准模型的特征点进行拟合,计算标准模型求得的特征点与Dlib获得的特征点之间的差,使用Ceres不断迭代优化,最终得到最佳的旋转和平移参数. ...
- UnityWebSocket
!!!转载注明:http://www.cnblogs.com/yinlong1991/p/unity_ylwebsocket.html Unity WebSocket 使用 Demo 线上测试地址 h ...
- python基础——字典(dict)
字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 . dict1 = {} ...
- 【Android】Genymotion 模拟器 Unable to create virtual device
安装 Genymotion 模拟器的时候报了这个错误,如下: 后来找到了解决方法,见下图: 在 Setting -> Network, 勾选 Use HTTP Proxy, HTTP Proxy ...
- 聊一聊Java的枚举enum
一. 什么是枚举 枚举是一种数据类型,具有集合的一些特点,可以存放多个元素,但存储对象有限且固定,枚举也有比较常见的使用场景,如我们需要表达性别(男.女),颜色(红.黄.蓝),星期(星期一.星期二.. ...
- Github上fork的项目如何merge原Git项目
问题场景 小明在Github上fork了一个大佬的项目,并clone到本地开发一段时间,再提交merge request到原Git项目,过了段时间,原作者联系小明,扔给他下面这幅截图并告知合并处理冲突 ...
- 关于python中的特殊方法
研究了几个小时,大概对python中的特殊方法一知半解,现在写写自己的理解,以及记录一些找到的资源.待自己有比较深入理解的时候,再来更新 https://docs.python.org/3/refer ...
- 深入了解String和intern
引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8 ...
- 编码规范 | Java函数优雅之道(上)
导读 随着软件项目代码的日积月累,系统维护成本变得越来越高,是所有软件团队面临的共同问题.持续地优化代码,提高代码的质量,是提升系统生命力的有效手段之一.软件系统思维有句话“Less coding, ...