设计模式(七)桥接

设计模式,桥接 · 浏览次数 : 44

小编点评

**1. 定义** * **抽象类(Abstraction):**定义抽象类的接口,包含抽象业务方法。 * **扩展抽象类(RefinedAbstraction):**扩充由Abstraction定义的接口,通常情况下他不再是抽象类而是具体类,实现了在Abstraction中声明的抽象业务方法。 * **实现类(Implementor):**定义实现类的接口,该接口不一定要与Abstraction的接口完全一致,事实上两个接口可以完全不同。 * **具体实现类(ConcreteImplementor):**具体实现实现类,在不同的ConcreteImplementor中提供基本操作的不同实现。 **2. 示例** ```java // Matrix类,辅助类,各种格式的图像文件最终都会被转化为像素矩阵 public class Matrix { // 省略实现代码 } // Image接口,充当抽象类 public abstract class Image { protected ImageImplementor imageImpl; public void SetImageImplementor(ImageImplementor imageImpl) { this.imageImpl = imageImpl; } public abstract void ParstFile(String fileName); } // JPGImage 类,扩充抽象类 public class JPGImage : Image { public override void ParstFile(String fileName) { // 模拟解析JPG文件并获得一个像素矩阵对象m Matrix m = new Matrix(); imageImpl.DoPaint(m); System.WriteLine("\"{0} : 格式为JPG\", fileName); } } ``` **3. 总结** * 抽象部分将定义抽象类的接口,而实现部分将定义具体实现类。 * 这是一种桥接模式,使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度变化。 * 取代多层继承方案,极大地减少了子类的个数。 * 提高了系统可扩展性,在两个变化维度中任意扩展一个维度,无需修改原有系统,符合开闭原则。

正文

一、定义

将抽象部分与它的实现部分解耦,使两者都能够独立变化,桥接模式是一种结构型模式。

二、描述

包含以下四个角色:
1、Abstraction(抽象类):它是用于定义抽象类的接口,通常是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Implementor之间具有关联关系,既可以包含抽象业务方法,也可以包含具体业务方法。
2、RefinedAbstratction(扩充抽象类):它扩充由Abstraction定义的接口,通常情况下他不再是抽象类而是具体类,实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在Implementor中定义的业务方法。
3、Implementor(实现类接口):它是定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上两个接口可以完全不同。一般而言,Implementor只提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声明,而将具体实现交给其子类。通过关联关系,在Abstraction中不仅可以拥有自己的方法,还可以调用Implementor中定义的方法,使用关联关系来替代继承关系。
4、ConcreteImplementor(具体实现类):它具体实现Implementor接口,在不同的ConcreteImplementor中提供基本操作的不同实现,在程序运行时,ConcreteImplentor对象将替换其父类对象,提供给抽象类具体的业务操作方法。

三、例子

X公司想要开发一个跨平台的图像浏览系统,要求该系统能够显示JPG、BMP、GIF、PNG等多种格式的文件,并且能够在Windows、Linux以及Unix等多个操作系统上运行。该系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵。该系统需要具备较好的扩展性以支持新的文件格式和操作系统。Matrix:像素矩阵类,辅助类,各种格式的图像文件最终都会被转化为像素矩阵,不同的操作系统提供不同的方式显示像素矩阵

public class Matrix
{
    // 省略实现代码
}

Image:抽象图像类,充当抽象类

public abstract class Image
{
    protected ImageImplementor imageImpl;

    public void SetImageImplementor (ImageImplementor imageImpl)
    {
        this.imageImpl = imageImpl;
    }

    public abstract void ParstFile(string fileName);
}

JPGImage、BMPImage、GIFImage:扩充抽象类

public class JPGImage : Image
{
    public override void ParstFile(string fileName)
    {
        // 模拟解析JPG文件并获得一个像素矩阵对象m
        Matrix m = new Matrix();
        imageImpl.DoPaint(m);
        Console.WriteLine("{0} : 格式为JPG", fileName);
    }
}

public class BMPImage : Image
{
    public override void ParstFile(string fileName)
    {
        // 模拟解析BMP文件并获得一个像素矩阵对象m
        Matrix m = new Matrix();
        imageImpl.DoPaint(m);
        Console.WriteLine("{0} : 格式为BMP", fileName);
    }
}

public class GIFImage : Image
{
    public override void ParstFile(string fileName)
    {
        // 模拟解析GIF文件并获得一个像素矩阵对象m
        Matrix m = new Matrix();
        imageImpl.DoPaint(m);
        Console.WriteLine("{0} : 格式为GIF", fileName);
    }
}

ImageImplementor:抽象操作系统实现类

public interface ImageImplementor
{
    // 显示像素矩阵
    void DoPaint(Matrix m);
}

WindowsImplementor、LinuxImplementor、UnixImplementor:具体实现类

public class WindowsImplementor : ImageImplementor
{
    public void DoPaint(Matrix m)
    {
        // 调用Windows的绘制函数绘制像素矩阵
        Console.WriteLine("在Windows系统中显示图像");
    }
}

public class LinuxImplementor : ImageImplementor
{
    public void DoPaint(Matrix m)
    {
        // 调用Linux的绘制函数绘制像素矩阵
        Console.WriteLine("在Linux系统中显示图像");
    }
}

public class UnixImplementor : ImageImplementor
{
    public void DoPaint(Matrix m)
    {
        // 调用Unix的绘制函数绘制像素矩阵
        Console.WriteLine("在Unix系统中显示图像");
    }
}

Program:测试代码

Matrix m = new Matrix();
ImageImplementor wi = new WindowsImplementor();
Image ji = new JPGImage();
ji.SetImageImplementor(wi);
ji.ParstFile("小龙女");
Console.ReadLine();

四、总结

1、优点

(1)分离抽象接口及其实现部分,桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度变化。
(2)取代多层继承方案,极大地减少了子类的个数。
(3)提高了系统可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则。

2、缺点

(1)增加了系统的理解和设计难度,需要开发者在一开始就对抽象层进行设计与编程。
(2)要求正确识别出系统中两个独立变化的维度,如何正确地识别需要一定的经验积累。

与设计模式(七)桥接相似的内容:

设计模式(七)桥接

一、定义 将抽象部分与它的实现部分解耦,使两者都能够独立变化,桥接模式是一种结构型模式。 二、描述 包含以下四个角色: 1、Abstraction(抽象类):它是用于定义抽象类的接口,通常是抽象类而不是接口,其中定义了一个Implementor(实现类接口)类型的对象并可以维护该对象,它与Imple

【23种设计模式】桥接模式(七)

## 前言 【**桥接模式**】是【**结构型**】设计模式的第二个模式,也有叫【桥模式】的,英文名称:**Bridge Pattern**。 大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的。因为桥在我们现实生活中经常是连接着A地和B地,再往后来发展,桥引申为

设计模式学习(八):桥接模式

设计模式学习(八):桥接模式 作者:Grey 原文地址: 博客园:设计模式学习(八):桥接模式 CSDN:设计模式学习(八):桥接模式 桥接模式 桥接模式是一种结构型模式。它将抽象部分和实现部分分离,使他们可以独立地变化。 使用桥接模式,可以将抽象和具体的发展单独分支(即:抽象中持有一个具体的引用)

【23种设计模式】适配器模式(六)

## 前言 从今天开始我们开始讲【结构型】设计模式,【结构型】设计模式有如下几种:**适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式**。【创建型】的设计模式解决的是对象创建的问题,那【结构型】设计模式解决的是类和对象的组合关系的问题。 今天我们就开始讲【结构型】设计模式里面

软件设计模式系列之九——桥接模式

桥接模式是一种结构型设计模式,它用于将抽象部分与其实现部分分离,以便它们可以独立地变化。这种模式涉及一个接口,它充当一个桥,使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系,从而减少类之间的紧密耦合度,使得系统更加灵活和可扩展。

Bridge 桥接模式简介与 C# 示例【结构型2】【设计模式来了_7】

〇、简介 1、什么是桥接模式? 一句话解释: 通过一个类的抽象,与另一个类的抽象关联起来,当做桥。此后不管两个抽象类的实现有多少种,均可以通过这个桥来将两个对象联系起来。 桥接,顾名思义就是用桥来连接河两岸,将原本不关联的两部分联系起来,且不影响两岸的各自演化,演化出来的不同对象仍可以通过这个桥连接

软件设计模式系列之八——适配器模式

适配器模式(Adapter Pattern)是一种结构性设计模式,它允许将一个类的接口转换成客户端希望的另一个接口。适配器模式通常用于解决两个不兼容接口之间的兼容性问题,使得不同接口的类可以一起工作。这个模式涉及一个称为适配器的类,它充当两个不同接口之间的桥梁,使得它们可以协同工作。

设计模式

设计模式的七大原则 1、开闭原则(Open Close Principle) 开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中

设计模式学习(七):适配器模式

设计模式学习(七):适配器模式 作者:Grey 原文地址: 博客园:设计模式学习(七):适配器模式 CSDN:设计模式学习(七):适配器模式 适配器模式 适配器模式是一种结构型模式。 举例说明,假设有一个播放器,需要根据不同格式以及对应的文件来播放,接口设计如下: public interface

软件设计模式系列之七——原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新对象,这种方式可以避免对象的重复初始化,提高性能,并使对象的创建更加灵活和动态。