C#设计模式之7-桥接模式
桥接模式(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-桥接模式的更多相关文章
- 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 ...
- 设计模式学习心得<桥接模式 Bridge>
说真的在此之前,几乎没有对于桥接模式的应用场景概念. 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来 ...
随机推荐
- js 中 attachEvent 简示例
attachEvent绑定事件,函数的默认this指向为window,要解决问题可以通过call改变方法的指向! var div = document.getElementsByTagName('di ...
- sql与SQL CODE和SQL State相关报错
操作数据库过程中,遇到许多问题,很多都与SQL CODE和SQL State相关,现在把一个完整的SQLCODE和SQLState错误信息和相关解释作以下说明,一来可以自己参考,对DB2错误自行找出原 ...
- GPO - File Server Management
Creating disk space usage quotas: File Screening Generate Storage Report, including file edit audit. ...
- GPO - Folder Mapping via GPO
Create a Group Policy on AD DC Server. The GPO policy will come into effect on the next login, or us ...
- 想用@Autowired注入static静态成员?官方不推荐你却还偏要这么做
生命太短暂,不要去做一些根本没有人想要的东西.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免费学习 ...
- 技术小菜比入坑 LinkedList,i 了 i 了
先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个长发飘飘却靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理 ...
- cropper.js 二次开发:截图并下载图片
cropper.js 是一个基于jquery的图片截取库. 参考:https://blog.csdn.net/weixin_38023551/article/details/78792400 我的代码 ...
- Sharding-Proxy的基本功能使用
Sharding-Proxy是一个分布式数据库中间件,定位为透明化的数据库代理端.作为开发人员可以完全把它当成数据库,而它具体的分片规则在Sharding-Proxy中配置.它的整体架构图如下: 在架 ...
- [jvm] -- 内存模型篇
内存模型 JDK1.6 JDK1.8 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线程共享的: 堆 方法区 直接内存 (非运行时数据区的一部分) 程序计数器 线程私有 两个作用 字节码解释器通 ...
- 推荐一款技术人必备的接口测试神器:Apifox
1. 背景 作为互联网行业技术从业者,接口调试是必不可少的一项技能,通常我们都会选择使用 Postman 这类工具来进行接口调试,在接口调试方面 Postman 做的确实非常出色.当然除了Postma ...