1、核心意图:
将抽象部分和实现部分分离,使它们都可以独立的变化。
该模式的目标是通过把高层的抽象和底层的实现分开,分别构建自己的类层次结构,并通过实现部分的接口将两部分进行桥接,从而达到高层抽象和底层实现可以独立的方便扩展的目的。其核心是分离,和委托。
2、身边实例:
Java语言的一个非常重要的特点是平台的无关性,对于一般的高级语言所编写的程序,如果要在不同的平台上运行,为了适应不同平台所带来的指令集及数据类型等所带来的差异,至少需要编译成不同的目标代码。
Java语言通过Java虚拟机实现了平台的无关性,虚拟机通过对底层平台指令集及数据类型等进行统一的抽象,针对不同的平台用不同的虚拟机进行实现,这样Java应用程序就可以通过编译成符合虚拟机规范的字节码文件,而在不同的平台上都能正确运行。
这里的虚拟机正是桥接模式一个很好的展示,它隔离了底层实现(指令/数据类型等)和高层的应用程序,对于新开发的每个Java应用程序,都只需要编译一次;而对于一个新平台的支持,也仅需提供一个相应的Java虚拟机,就可以使所有应用系统正确运行。
Java应用程序及虚拟机的大体结构图如下:
3、动机简述:
在该模式的动机中,描述了一个平台可移植的用户界面工具箱,在该工具箱中会有多种窗口Window类型,为了实现平台的可移植性,把窗口的实现部分从窗口类型中抽取出来,构成一个独立的窗口实现WindowImp类层次,从而使得抽象窗口和窗口实现都可以独立变化,以便于支持新的窗口类型和平台实现。
4、模式效果:
桥接Bridge模式有两个主要效果:1)通过分离抽象部分和实现部分,使两者可以独立变化;2)向客户隐藏了实现部分,从而当需要扩展/更改实现部分时,不需要重新编译客户代码。
对于效果1),当抽象部分和实现部分比较多样时,可以显著的减少类的种类,并提高代码的灵活性。假定高层抽象和底层实现分别有5种类型,如果不采用桥接模式,而用继承实现,那么就需要5*5=25个类(另有一个抽象类);如果采用桥接模式,将抽象部分和实现部分分离,就只需要5+5=10个类就可以(另有两个抽象类),两种实现的类如以下表格中所示:
继承方式实现:
|
Implementor
|
Imp1
|
Imp2
|
Imp3
|
Imp4
|
Imp5
|
Abstraction
|
Abs1
|
Abs1Imp1
|
Abs1Imp2
|
Abs1Imp3
|
Abs1Imp4
|
Abs1Imp5
|
Abs2
|
Abs2Imp1
|
Abs2Imp2
|
Abs2Imp3
|
Abs2Imp4
|
Abs2Imp5
|
Abs3
|
Abs3Imp1
|
Abs3Imp2
|
Abs3Imp3
|
Abs3Imp4
|
Abs3Imp5
|
Abs4
|
Abs4Imp1
|
Abs4Imp2
|
Abs4Imp3
|
Abs4Imp4
|
Abs4Imp5
|
Abs5
|
Abs5Imp1
|
Abs5Imp2
|
Abs5Imp3
|
Abs5Imp4
|
Abs5Imp5
|
桥接模式实现:
|
Implementor
|
Imp1
|
Imp2
|
Imp3
|
Imp4
|
Imp5
|
Abstraction
|
Abs1
|
通过桥接关联
|
Abs2
|
Abs3
|
Abs4
|
Abs5
|
5、Java代码示例:
下面代码演示了一个支持不同平台的图形对象应用,图形Shape有多种类型,如三角形正方形等,为了在不同平台中实现图形的绘制,把实现部分进行了分离,构成了ShapeImp类层次结构,包括在Windows中的ShapeImpWin,和Unix中的ShapeImpUnix,类结构图如下:
代码清单如下:
package qinysong.pattern.bridge;

public class Point {

private int coordinateX;
private int coordinateY;

public Point(int coordinateX, int coordinateY){
this.coordinateX = coordinateX;
this.coordinateY = coordinateY;
}
public String toString(){
return "Point[x=" + coordinateX + ",y=" + coordinateY + "]";
}
public int getCoordinateX() {
return coordinateX;
}
public int getCoordinateY() {
return coordinateY;
}
}
类ShapeImp,实现接口(对应Implementor),这里只是画一条直线
package qinysong.pattern.bridge.implement;

import qinysong.pattern.bridge.Point;

public interface ShapeImp {
public void drawLine(Point startPoint, Point endPoint);
}
类ShapeImpWin,实现接口的Windows实现类(对应ConcreteImplementor)
package qinysong.pattern.bridge.implement;

import qinysong.pattern.bridge.Point;

public class ShapeImpWin implements ShapeImp {

/**
* 实现ShapeImp接口方法
* @param startPoint Point
* @param endPoint Point
*/
public void drawLine(Point startPoint, Point endPoint) {
System.out.println("ShapeImpWin.drawLine startPoint=" + startPoint + ",endPoint=" + endPoint);
}
}
类ShapeImpUnix,实现接口的Unix实现类(对应ConcreteImplementor)
package qinysong.pattern.bridge.implement;

import qinysong.pattern.bridge.Point;

public class ShapeImpUnix implements ShapeImp {

/**
* 实现ShapeImp接口方法
* @param startPoint Point
* @param endPoint Point
*/
public void drawLine(Point startPoint, Point endPoint) {
System.out.println("ShapeImpUnix.drawLine startPoint=" + startPoint + ",endPoint=" + endPoint);
}
}
类Shape,图形抽象类(对应Abstraction),具体类型包括三角形、正方形等
package qinysong.pattern.bridge.abstraction;

import qinysong.pattern.bridge.implement.ShapeImp;
import qinysong.pattern.bridge.ShapeImpFactory;

public abstract class Shape {

protected ShapeImp shapeImp;
protected void initShapeImp(){
shapeImp = ShapeImpFactory.getShapeImp();
}

//定义图形抽象类的接口方法
public abstract void drawShape();

}
类Triangle,三角形(对应RefinedAbstraction)
package qinysong.pattern.bridge.abstraction;

import qinysong.pattern.bridge.Point;

public class Triangle extends Shape{

//实现抽象图形类Shape接口方法,绘制一个三角形
public void drawShape() {
System.out.println("Triangle.drawShape 绘制一个三角形...");
initShapeImp();
shapeImp.drawLine(new Point(0,0), new Point(10,0));
shapeImp.drawLine(new Point(0,0), new Point(5,10));
shapeImp.drawLine(new Point(5,10), new Point(10,0));
}
}
类Square,正方形(对应RefinedAbstraction)
package qinysong.pattern.bridge.abstraction;

import qinysong.pattern.bridge.Point;

public class Square extends Shape{

//实现抽象图形类Shape接口方法,绘制一个正方形
public void drawShape() {
System.out.println("Square.drawShape 绘制一个正方形...");
initShapeImp();
shapeImp.drawLine(new Point(0,0), new Point(10,0));
shapeImp.drawLine(new Point(0,0), new Point(0,10));
shapeImp.drawLine(new Point(0,10), new Point(10,10));
shapeImp.drawLine(new Point(10,0), new Point(10,10));
}
}
类Client,桥接模式的客户
package qinysong.pattern.bridge;

import qinysong.pattern.bridge.abstraction.Shape;
import qinysong.pattern.bridge.abstraction.Square;
import qinysong.pattern.bridge.abstraction.Triangle;

public class Client {

public static void main(String[] args) {
System.out.println("Client.main begin ..........");
Shape shape = new Square();
shape.drawShape();
Shape shape2 = new Triangle();
shape2.drawShape();

System.out.println("Client.main end ..........");
}
}
类ShapeImpFactory,工厂类,供抽象部分调用,分离实现类的创建过程
package qinysong.pattern.bridge;

import qinysong.pattern.bridge.implement.ShapeImp;
import qinysong.pattern.bridge.implement.ShapeImpWin;

public class ShapeImpFactory {
public static ShapeImp getShapeImp(){
return new ShapeImpWin();
}
}
分享到:
相关推荐
【Java桥接模式】是一种设计模式,用于将抽象部分与实现部分分离,使得它们可以独立进行变化。在上述场景中,我们看到一个典型的桥接模式应用:发送提示消息功能。 1. 场景问题: - 发送提示消息功能涉及到不同...
桥接模式和策略模式是软件设计模式中的两种重要模式,它们在实现上有着相似之处,但各自的应用场景和设计理念有所不同。下面将详细阐述这两种模式的特点、区别以及它们在实际编程中的应用。 首先,桥接模式(Bridge...
在Java中,桥接模式的实现通常涉及以下步骤: 1. 定义Implementor接口,如`Color`接口,包含绘制颜色的方法。 2. 创建具体实现类,如`RedColor`和`BlueColor`,实现`Color`接口。 3. 定义Abstraction接口,如`Shape`...
在Java中,桥接模式通常用于处理类的膨胀问题,特别是当有多个维度的分类或者组合时,避免过度的类数量爆炸。 在描述中提到的场景是一个Photoshop图形工具的例子,其中有各种形状(如星星、方形、圆形)和多种颜色...
Java 桥接模式原理及用法解析 Java 桥接模式是一种结构型设计模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型...
让我们深入探讨一下桥接模式的原理、应用场景以及如何在Java中实现。 **桥接模式的核心思想** 1. **分离接口与实现**:桥接模式将抽象接口与其实现分离开来,使得两者可以独立变化。这样,当需要改变一个部分时,...
Java 桥接模式 设计模式 桥接模式(Bridge Pattern)是一种常用的设计模式,它将抽象化和实现化解耦,使用封装、聚合以及继承等基本技术,将两个独立变化的维度通过抽象化的方式进行桥接,从而降低了它们之间的耦合...
Java桥接模式详解 Java桥接模式是一种结构式设计模式,它的主要作用是将抽象部分与实现部分分离,使它们都可以独立的变化。桥接模式可以在程序运行期间动态地设置抽象部分需要用到的具体的实现,还可以动态切换具体...
桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。在Java中,这种模式常用于降低复杂系统的设计耦合性,提高系统的可扩展性和可维护性。刘伟老师的《设计模式》一书中的桥接模式...
总结,Java桥接模式通过抽象部分与实现部分的解耦,提供了更高的灵活性和可扩展性。在上述实例中,`Meal` 类作为抽象部分,`MealImp` 接口及其实现类作为实现部分,共同构建了一个允许动态组合不同餐饮文化的框架。...
4. 代码实现,展示如何在编程语言中实现桥接模式,可能包括Java、C#或Python等。 5. 桥接模式与其他设计模式的对比,如装饰器模式、适配器模式等。 6. 桥接模式的优缺点分析,以及在实际项目中的应用示例。 7. 如何...
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...
总结起来,Java 桥接模式的关键在于将抽象和实现分离,通过组合的方式降低类之间的耦合度,提高代码的可读性和可维护性。在实际项目中,当面临多种抽象和实现需要组合时,考虑使用桥接模式能够简化设计,便于后续的...
桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使它们都可以独立地变化。更容易理解的表述是:实现系统可从多种维度分类,桥接模式将各维度抽象出来,各维度独立变化,之后可通过聚合,将各维度组合...
在Java编程中,桥接模式可以帮助我们处理多维度的变化,避免过度使用继承导致的类爆炸问题。 在桥接模式中,有四个主要的角色: 1. **抽象化(Abstraction)**:定义抽象接口,提供高层的业务逻辑,它引用实现化...
桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件工程中被广泛应用于处理组件之间的耦合问题,使得系统具有更好的可扩展性和灵活性。 桥接模式的主要组成部分...
**Android桥接模式详解** 桥接模式是一种设计模式,它将抽象部分与实现部分分离,使得它们可以独立地进行变化。在Android开发中,尤其是在构建可扩展和灵活的架构时,这种模式尤其有用。本文将深入探讨桥接模式在...
桥接模式是软件设计模式中的一种结构型模式,它的主要目的是为了实现抽象和实现的解耦,使得两者可以独立地进行扩展。在桥接模式中,抽象类(Abstraction)不直接引用具体实现(Implementation),而是通过一个桥接...