一、桥接模式简介(Brief Introduction)

桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化。<?XML:NAMESPACE PREFIX = O />
Decouple an abstraction from its implementation so that the two can vary independently.。
什么是聚合/组合:
聚合(Aggregation),当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚合关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。
场景:商品和他的规格、样式就是聚合关系。
类与类的聚合关系图
<?XML:NAMESPACE PREFIX = V />
组合(Composite,对象A包含对象B,对象B离开对象A没有实际意义。是一种更强的关联关系。人包含手,手离开人的躯体就失去了它应有的作用。
场景: Window窗体由滑动条slider、头部Header 和工作区Panel组合而成。
类与类的组合关系图
聚合与合成原则:尽量使用聚合或者组合,尽量不使用类继承。
对象的继承关系是在编译时就定义好的,所以无法在运行时改变从父类继承的实现 。子类的实现与它的父类有着非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当需要复用子类时,如果集成下来的实现不符合解决新的问题,则父类必然重写或被其他更合适的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

二、解决的问题(What To Solve)

       当系统有多维角度分类时,而每一种分类又有可能变化,这时考虑使用桥接模式比较合适。

三、桥接模式分析(Analysis)

1、桥接模式结构

 

Abstraction:业务抽象类,定义一个抽象接口,维护对Impementor的引用.
RefinedAbstraction:具体实现类,被提炼的抽象
Implementor:定义一个抽象实现类,此抽象类与Abstraction类不一定完全相同。Implementor类提供了一些原始的操作,而Abstraction类是对这些原始操作一个更高层次的封装.
ConcreteImplementorAConcreteImplementorA:具体实现

2、代码

1、业务抽象类Abstraction及其提炼出的具体实现类RefinedAbstraction
public abstract class Abstraction
{
    protected Implementor _implementor;
    public Implementor Implementor
    {
        set { _implementor = value; }
        get { return _implementor; }
    }
    public virtual void Operation()
    {
        _implementor.OperationImp();
    }
}
public class RefinedAbstraction:Abstraction
{
    public override void Operation()
    {
        _implementor.OperationImp();
    }
}
2、抽象实现类Implementor 及其具体实现类ConcreteImplementorA
和ConcreteImplementorB
public abstract class Implementor
{
    public abstract void OperationImp();
}
public class ConcreteImplementorA:Implementor
{
    public override void OperationImp()
    {
        Console.WriteLine("{0} Operation Method",this.GetType().Name);
    }
}
public class ConcreteImplementorB:Implementor
{
    public override void OperationImp()
    {
        Console.WriteLine("{0} Operation Method", this.GetType().Name);
    }
}
2、客户端代码
static void <?XML:NAMESPACE PREFIX = ST2 />Main(string[] args)
{
    Abstraction a1 = new RefinedAbstraction();
    // Set implementation and ca<?XML:NAMESPACE PREFIX = ST1 />ll
    a1.Implementor = new ConcreteImplementorA();
    a1.Operation();
    // Change implemention and call
    a1.Implementor = new ConcreteImplementorB();
    a1.Operation();
    Console.ReadKey();
}

3、实例运行结果

转载于:https://blog.51cto.com/smartlife/265768

Net设计模式实例之桥接模式( Bridge Pattern)(1)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 极速理解设计模式系列:7.桥接模式(Bridge Pattern)

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

  7. 【设计模式·结构型】桥接模式Bridge Pattern

    目的 该模式用于分离抽象与实现,并且抽象与实现可以独立变化 应用场景 (1)希望抽象和实现之间没有固定的绑定关系,不同抽象接口和实现可以组合和扩充,程序运行时动态选择.切换具体实现 (2)类层次结构, ...

  8. 桥接模式(Bridge Pattern)

    桥接模式概述 定义:将抽象部分与它的实现部分解耦,使得两者都能够独立的变化 就拿我们日常使用的蜡笔来说,蜡笔有不同的大小和颜色,所以我们往往买的蜡笔盒中会有不少的蜡笔.需要用哪个就用哪个,是不是很方便 ...

  9. 《研磨设计模式》chap24 桥接模式bridge(2)场景应用

    1. 模式应用到场景中 public abstract class AbstractMessage {//持有一个实现部分的对象 protected MessageImplementor impl;p ...

  10. Net设计模式实例之备忘录模式(Memento Pattern)

    一.备忘录模式简介(Brief Introduction) 备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以就该对 ...

最新文章

  1. DataGrid 的 全选/取消全选 控制(CheckBox)
  2. Java8 stream操作
  3. python 两个列表相互映射_Python基础 — 10分钟学习函数式Python
  4. 流畅的python读书笔记-第一章Python 数据模型
  5. 成功解决AttributeError: ‘dict_values‘ object has no attribute ‘index‘
  6. 星模php格,extend/base/TencentSms.php · 纵之格/ShopXO - Gitee.com
  7. java : NoSuchMethodError: org.codehaus.jackson.JsonNode.asInt()
  8. JVM技术周报第1期
  9. 【⭐阅读推荐指数:5颗星★★★★★⭐】关于多副本纠删码,你想知道的全都在这里
  10. FudanNLP  java -based
  11. SSM框架小项目 ACM周总结管理系统 V1.1 开源
  12. 钉钉本地开发环境配置(H5微应用)
  13. “数字孪生”语境下的城市:拼图模式与航向之争
  14. 微信小程序之校园二手交易系统app毕业设计ssm
  15. C++ accumulate()函数
  16. 【多线程与高并发】JMM内存模型 基础
  17. Mysql 6.0无法手动抛异常
  18. 假作真时真亦假——“真实”IP带来的安全隐患
  19. 却话文心一言(Chatgpt们),存算一体真能突破AI算力“存储墙”|“能耗墙”|“编译墙”?
  20. YonBuilder之单表,主子表的建立

热门文章

  1. 【ArcGIS|空间分析】地形特征相关计算
  2. ArcGIS操作小技巧(五)之色带-----横向(水平)图例
  3. ContentObserve的基本使用方法
  4. RTP协议RTCP协议
  5. CentOS7和Ubuntu16设置静态ip的方法
  6. 深度系统优化工具_HiBit Uninstaller卸载工具【win版】
  7. linux csi 摄像头,A20 linux(dragonboard)同时使用Parallel CSI Camera及UVC
  8. asp oracle数据库开发 adodb,asp怎么连接oracle数据库
  9. php 异步执行脚本,PHP语言实现脚本异步执行_PHP教程
  10. oracle中job的retry次数,Oracle 19c注意事项: DBMS_JOB 行为变化