前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >桥接模式(Birdge)

桥接模式(Birdge)

作者头像
happlyfox
发布2018-10-31 14:48:01
6950
发布2018-10-31 14:48:01
举报
文章被收录于专栏:技术开源分享技术开源分享

模式定义

桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。

桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。

将抽象部分与他的实现部分分离这句话不是很好理解,其实这并不是将抽象类与他的派生类分离,而是抽象类和它的派生类用来实现自己的对象。这样还是不能理解的话。我们就先来认清什么是抽象化,什么是实现化,什么是脱耦。

抽象化:其概念是将复杂物体的一个或几个特性抽出去而只注意其他特性的行动或过程。在面向对象就是将对象共同的性质抽取出去而形成类的过程。

实现化:针对抽象化给出的具体实现。它和抽象化是一个互逆的过程,实现化是对抽象化事物的进一步具体化。 脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。

对于那句话:将抽象部分与他的实现部分分离套用《大话设计模式》里面的就是实现系统可能有多个角度分类,每一种角度都可能变化,那么把这种多角度分类给分离出来让他们独立变化,减少他们之间耦合。

桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。

模式结构

桥接模式主要包含如下几个角色: Abstraction:抽象类。 RefinedAbstraction:扩充抽象类。 Implementor:实现类接口。 ConcreteImplementor:具体实现类 。

UML图如下

桥接模式UML.png

案例说明

我们通过一个简单的案例来说明桥接模式的用法 一切的对象都是基于现实生活的抽象,那我们以不同颜色不同形状的物理举例。假设我们现在拥有红,绿,蓝三种颜色,拥有圆形,正方形和菱形三种物体,我们希望得到不同物体的不同颜色的打印。

方法1: 定义实体类: 颜色三种,物品三种。生成3*3个实体类=9 这种方法的缺点在于,如果我在添加一个颜色,或者添加一个物品,那个对应的实体类个数就要增加,这样的方法一定是不适用的,太过笨。

方法2: 采用颜色和物品组合的方法实现功能 我们打印出物品的颜色,那我们首先要知道是什么物品,物品是什么颜色。 基于这俩个问题我们其实可以得到一个方法 物品.打印(颜色) 基于桥接模式角色定义我们可以一一匹配 物品是抽象类的实现 颜色是接口

1、我们首先需要一个物品的基类,让所有的物品实现这个基类,调用基类抽象方法打印物品。 2、定义颜色接口,定义颜色类实现接口方法,接口定义的方法就是返回当前的颜色 3、物品调用抽象应该有一个形参(IColor),方便在打印物品的时候添加颜色说明

案例编码

形状

代码语言:javascript
复制
/// <summary>
    /// 形状抽象基类
    /// </summary>
    public abstract class Shape
    {
        public abstract void Draw(IColor color);
    }

    /// <summary>
    /// 圆形类
    /// </summary>
    public class Cycle : Shape
    {
        public override void Draw(IColor color)
        {
            Console.WriteLine(color.GetColor() + "圆形");
        }
    }


    /// <summary>
    /// 正方形类
    /// </summary>
    public class Square : Shape
    {
        public override void Draw(IColor color)
        {
            Console.WriteLine(color.GetColor() + "正方形");
        }
    }

颜色

代码语言:javascript
复制
 /// <summary>
    /// 颜色接口
    /// </summary>
    public interface IColor
    {
        string GetColor();
    }

    public class WhiteColor : IColor
    {
        public string GetColor()
        {
            return "白色";
        }
    }

    public class BlankColor : IColor
    {
        public string GetColor()
        {
            return "黑色";
        }
    }

调用

代码语言:javascript
复制
 public class ShapeColor
    {
        public static void PrintShapeColor()
        {
            Shape shape = new Cycle();//实例化形状类
            IColor color = new WhiteColor();//实例化颜色类
            shape.Draw(color);//形状调用颜色

            //实现耦合,使用组合模式而不是继承模式

        }
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.08.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模式定义
  • 模式结构
  • 案例说明
  • 案例编码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档