四个角色:抽象类(Abstraction)、扩充抽象类(RefinedAbstraction)、实现类接口(Implementor)、具体实现类(ConcreteImplementor)

抽象类(Abstraction):主控类,内部有一个实现类接口(Implementor)的对象可调用。

扩充抽象类(RefinedAbstraction):扩充抽象类,个性定制自身行为和属性继承于Abstraction。

实现类接口(Implementor):被操作类。

具体实现类(ConcreteImplementor) :继承并实现Implementor。

 实现思路:多个扩充抽象类继承于Abstraction主控类,并且操作其内部的Implementor的行为。以此达到控制多种具体实现类的目的。这是一个多对多的关系。

 类图:

应用场景:人听音乐,人有很多种人(年轻人、老年人、中年人、小孩子等),音乐有很多种(摇滚音乐、乡村音乐、爵士音乐、流行音乐等)。

分析:不同的人可以听不同种类的音乐,人的种类是会变化的,音乐的种类也是活动可变的,在这里将人和音乐抽象出来,并且将音乐的抽象放入人的抽象中去,这样人听什么音乐将有客户端决定。

下面我们在控制台程序去演示一下如何使用Bridge Pattern:

一、 抽象类(Abstraction)

  1. //抽象类(Abstraction)
  2. abstract class People
  3. {
  4. private Music music;
  5. public Music Music
  6. {
  7. get { return music; }
  8. set { music = value; }
  9. }
  10. public abstract void StartListen();
  11. }

二、扩充抽象类(RefinedAbstraction)

  1. // 扩充抽象类(RefinedAbstraction)
  2. class YoungPeople : People
  3. {
  4. public override void StartListen()
  5. {
  6. Console.Write("年轻人在听");
  7. Music.Play();
  8. }
  9. }
  10. // 扩充抽象类(RefinedAbstraction)
  11. class OldPeople : People
  12. {
  13. public override void StartListen()
  14. {
  15. Console.Write("老年人在听");
  16. Music.Play();
  17. }
  18. }

三、实现类接口(Implementor)

  1. // 实现类接口(Implementor)
  2. abstract class Music
  3. {
  4. public abstract void Play();
  5. }

四、具体实现类(ConcreteImplementor)

  1. // 具体实现类(ConcreteImplementor)
  2. class RockMusic : Music
  3. {
  4. public override void Play()
  5. {
  6. Console.WriteLine("摇滚歌曲");
  7. }
  8. }
  9. // 具体实现类(ConcreteImplementor)
  10. class CountryMusic : Music
  11. {
  12. public override void Play()
  13. {
  14. Console.WriteLine("乡村歌曲");
  15. }
  16. }

五、客户端(Client)

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. //客户端实现。
  6. People youngPeople = new YoungPeople();
  7. youngPeople.Music = new RockMusic();
  8. youngPeople.StartListen();
  9. youngPeople.Music = new CountryMusic();
  10. youngPeople.StartListen();
  11. Console.WriteLine("------------------");
  12. People oldPeople = new OldPeople();
  13. oldPeople.Music = new CountryMusic();
  14. oldPeople.StartListen();
  15. Console.ReadLine();
  16. }
  17. }

如需源码请点击 BridgePattern.rar  下载。

转载于:https://blog.51cto.com/chengxingliang/826976

极速理解设计模式系列:7.桥接模式(Bridge Pattern)相关推荐

  1. 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

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

    3.客户端代码<?XML:NAMESPACE PREFIX = O /> static void <?XML:NAMESPACE PREFIX = ST2 />Main(str ...

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

    四.桥接模式实例分析(Example) 1.场景 业务对象(BusinessObject)与数据对象(DataObject)分离,即业务对象CustormerBase与数据对象DataObject分离 ...

  4. 极速理解设计模式系列:11.单例模式(Singleton Pattern)

    单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 三要点: 一.单例类只能有一个实例 二.单例类必须自行创建自身实例 三.单例类自行向整个系统提供实例 类 ...

  5. 极速理解设计模式系列:2.观察者模式(Observer Pattern)

    4个角色:被观察者(Subject/目标对象接口),具体被观察者(ConcreteSubject/具体目标对象),观察者(Observer),具体观察者(ConcreteObserver)       ...

  6. 极速理解设计模式系列:6.适配器模式(Adapter Pattern)

    四个角色:目标抽象类角色(Target).目标对象角色(Adapter).源对象角色(Adaptee).客户端角色(Client) 目标抽象类角色(Target):定义需要实现的目标接口 目标对象角色 ...

  7. 极速理解设计模式系列【目录索引】

    这是一个老生常谈的设计模式系列文章,本系列力图从最简洁的语言和最易理解的实例来让大家认识设计模式的思想和思路,从而在实际项目中能够用到一二.现在将本系列文章详列如下: 极速理解设计模式系列:1.建造者 ...

  8. 【愚公系列】2021年12月 二十三种设计模式(七)-桥接模式(Bridge Pattern)

    文章目录 前言 一.桥接模式(Bridge Pattern) 二.使用步骤 角色 示例 总结 优点 缺点 使用场景 前言 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分 ...

  9. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  10. 简易理解设计模式之:桥接模式——穿衣服经典案例2

    介绍: 桥接模式属于结构型模式.它的定义为:将抽象部分与实现部分分离,使它们都可以独立的变化. 类图: Abstraction(抽象化角色):抽象部分,保持对实现部分对象的引用,抽象部分中的方法需要调 ...

最新文章

  1. 在做会员资料修改时,实现下拉菜单的默认项定位
  2. ECCV 2020 | 腾讯优图8篇论文入选,涵盖目标跟踪、行人重识别、人脸识别等领域...
  3. 清华大学贾宁_《财务思维》_体系结构
  4. 12.10课堂学习----实例化、构造方法案例
  5. SQLServe错误整理
  6. python参数化_Python 中如何实现参数化测试的方法示例
  7. ArcGIS 创建格网与图斑数据叠加;频数统计与面积比例计算
  8. 手机怎样查看计算机使用记录,如何查看电脑使用记录
  9. 幼儿园网络图怎么绘制_如何设计幼儿园主题网络图
  10. 让QQ群昵称色变的神奇代码
  11. 使用文氏图说明贝叶斯公式如何导出、推导朴素贝叶斯算法以及实例
  12. LR参数化,参数化类型:Fille类型--2列多个参数
  13. java fianlly_Java冷知识:finally中的代码一定会执行吗?
  14. 经典的三角形软件测试用例
  15. OpenCV-Python 级联分类器训练 | 六十三
  16. c++语言 构造函数,C++中构造函数的写法
  17. 网络基础之动态路由协议(OSPF)
  18. 新的篇章:来自鲍尔默和艾洛普的公开信
  19. v62.02 鸿蒙内核源码分析(文件概念) | 为什么说一切皆是文件 | 百篇博客分析OpenHarmony源码
  20. 一次脑残的记录: Linux 中实时任务调度与优先级

热门文章

  1. 干货丨从起源到具体算法,这是一份适合所有人读的深度学习综述论文
  2. 通用AI咋发展?向大脑学习是条路子
  3. 可持续发展的人工智能
  4. 生物,AI,心理:目前的大脑/认知/意识/AGI/DRL模型
  5. 预测|十张图带你了解2018年机器人行业趋势与前景
  6. 谷歌Jeff Dean团队提出利用深度学习对「电子健康记录」数据进行分析,可提高医疗诊断预测的准确性
  7. 联合国《2017年信息经济报告》
  8. 趁老婆不在家,我把儿子带成了程序大神...
  9. 面试官:兄弟,说说 ArrayList 和 LinkedList 有什么区别
  10. 意想不到,这个神奇的 Bug 让我加班到深夜