设计模式(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 ...
随机推荐
- Apache SSI 远程命令执行漏洞复现
Apache SSI 远程命令执行漏洞复现 一.漏洞描述 当目标服务器开启了SSI与CGI支持,我们就可以上传shtml,利用<!--#exec cmd=”id” -->语法执行命令. 使 ...
- javaScript常用运算符和操作符总结
javaScript常用运算符和操作符总结 类别 操作符 算术操作符 +. –. *. /. %(取模) 字符串操作符 + 字符串连接 +=字符串连接复合 布尔操作符 !. &&. ...
- 计数排序and基数排序
1 计数排序,稳定 复杂度o(k + n) public static int[] countingSort(int[] nums) { int n = nums.length; ; ; i & ...
- VIM常用命令速查(转)
- RobotFramework_4.SeleniumLibrary操作(二)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- PythonDay04
## 第四章 ### 今日内容 - 列表- 元组- range ### 列表 列表相比于字符串,不仅可以储存不同的数据类型,而且可以储存大量数据,是一种可变的数据类型 64位python的限制是 11 ...
- Hystrix超时测试
package com.cookie.test; import com.netflix.hystrix.HystrixCommand; import com.netflix.hystrix.Hystr ...
- Storm初识(1)
在Storm集群中,有两类节点:主节点 master node 和工作节点 worker nodes. 主节点运行着一个叫做Nimbus的守护进程.这个守护进程负责在集群中分发代码,为工作节点分配任务 ...
- CPU中的cache结构以及cache一致性
一. 引子 在多线程环境中,经常会有一些计数操作,用来统计线上服务的一些qps.平均延时.error等.为了完成这些统计,可以实现一个多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值.在实 ...
- 给debian的docker容器添加crontab定时任务
现在大部分的docke镜像是基于debian # cat /etc/issue Debian GNU/Linux 9 \n \l Docker容器是不支持后台服务的,像systemctl servic ...