首页 > 编程语言 >Java设计模式之桥接模式

Java设计模式之桥接模式

时间:2023-11-06 10:12:57浏览次数:26  
标签:Java 桥接 Vehicle 实现 抽象 vehicle 设计模式 public

桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

假如你有一个几何形状(Shape)类, 从它能扩展出两个子类: 圆形(Circle)和方形(Square)。你希望对这样的类层次结构进行扩展以使其包含颜色, 所以你打算创建名为红色(Red)和蓝色(Blue)的形状子类。但是,由于你已有两个子类,所以总共需要创建四个类才能覆盖所有组合,例如蓝色圆形(BlueCircle)和红色方形(RedSquare)。
在层次结构中新增形状和颜色将导致代码复杂程度指数增长。例如添加三角形状,你需要新增两个子类,也就是每种颜色一个;此后新增一种新颜色需要新增三个子类,即每种形状一个。如此以往,情况会越来越糟糕。

优点

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明

缺点

由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。

结构

桥接(Bridge)模式包含以下主要角色。

抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。提供高层控制逻辑, 依赖于完成底层实际工作的实现对象。
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
客户端(Client):仅关心如何与抽象部分合作。但是,客户端需要将抽象对象与一个实现对象连接起来。
适用场景
当一个对象有多个变化因素的时候,考虑依赖于抽象的实现,而不是具体的实现。如手机品牌有2种变化因素,一个是品牌,一个是功能。
当多个变化因素在多个对象间共享时,考虑将这部分变化的部分抽象出来再聚合/合成进来,如通讯录和游戏,其实是可以共享的。
当我们考虑一个对象的多个变化因素可以动态变化的时候,考虑使用桥接模式,如上面例子中的手机品牌是变化的,手机的功能也是变化的,所以将他们分离出来,独立的变化。
实现
明确类中独立的维度。独立的概念可能是:抽象/平台,域/基础设施,前端/后端或接口/实现。
了解客户端的业务需求,并在抽象基类中定义它们。
确定在所有平台上都可执行的业务。并在通用实现接口中声明抽象部分所需的业务。
为你域内的所有平台创建实现类,但需确保它们遵循实现部分的接口。
在抽象类中添加指向实现类型的引用成员变量。抽象部分会将大部分工作委派给该成员变量所指向的实现对象。
如果你的高层逻辑有多个变体,则可通过扩展抽象基类为个变体创建一个精确抽象。
客户端代码必须将实现对象传递给抽象部分的构造函数才能使其能够相互关联。此后,客户端只需与抽象对象进行交互,无需和实现对象打交道

[实验任务一]:两个维度的桥接模式

用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。

 

 

public class Bus implements Vehicle
{
@Override
public void drive()
{
System.out.print("大巴");
}
}
public class Car implements Vehicle
{
@Override
public void drive()
{
System.out.print("小轿车");
}
}
public class CementRoad extends Road
{
public CementRoad(Vehicle vehicle)
{
super(vehicle);
}
@Override
public void driveOnRoad()
{
super.vehicle.drive();
System.out.println("行驶在水泥路");
}
}
public class main {
public static void main(String[] args) {
Road road = new CementRoad(new Car());
road.driveOnRoad();
}
}
public abstract class Road
{
protected Vehicle vehicle;
public Road(Vehicle vehicle)
{
this.vehicle = vehicle;
}
public abstract void driveOnRoad();
}
public class UnpavedRoad extends Road
{
public UnpavedRoad(Vehicle vehicle)
{
super(vehicle);
}
@Override
public void driveOnRoad()
{
super.vehicle.drive();
System.out.println("行驶在沥青路");
}
}
public interface Vehicle {
public void drive();
}

 

标签:Java,桥接,Vehicle,实现,抽象,vehicle,设计模式,public
From: https://www.cnblogs.com/lxh-666/p/17811902.html

相关文章

  • java设计模式之适配器模式
    定义将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。......
  • java web 上传文件夹的实现(支持Chrome)
    上传文件夹的思路其实就是将文件夹中所有的文件上传到服务器,上传的时候文件名称要从文件夹目录开始截取,以下图中的目录为例,index.html文件应该以news_1/index.html的路径传到服务器,所有文件上传之后,上传到服务器的文件夹路径是从上传的上传的文件路径截取到文件夹结束。下面详细介......
  • 设计模式六大原则
    前言什么是设计模式?设计模式是软件设计人员、软件开发人员在程序代码编写中总结出来的一套编码规范,设计模式起一个指导作用,用来指导我们写出高内聚低耦合,具有良好的可扩展性和可维护性的代码。为什么要学设计模式?当然,设计模式不是非学不可,不了解设计模式一样可以在工作中写出......
  • 实验9:桥接模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解桥接模式的动机,掌握该模式的结构;2、能够利用桥接模式解决实际问题。 [实验任务一]:两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。实验要求:1. 画出对应......
  • 关于 JavaScript 模块化的描述
    AMD是RequireJS在推广过程中对模块定义的规范化产出,而CMD是SeaJS在推广过程中对模块定义的规范化产出,也就是,RequireJS遵循AMD规范,而Sea.js遵循CMD规范eaJs遵循CMD规范为通用模块规范,RequireJs遵循AMD规范为异步模块规范。CMD依赖就近,AMD依赖前置。//CMDCommonModuleD......
  • Javascript中表达式 "2"+3+4 的值为 "234"
    是左关联,表达式相当于("2"+3)+4根据ES5规范11,6,1节,如果某个操作数是字符串或者能够通过以下步骤转换为字符串的话,+将进行拼接操作。数字+字符串=>(数字).toString()+字符串如:1+'2'=12数字-字符串=>数字-Number(字符串)如:1-'2'=-1+是左连接......
  • 206-java修改图片文件的元属性值TIFF_TAG_SOFTWARE等
    base64的图片转为文件//base64的图片转为文件Stringbase64String=obj.getString("base64");byte[]imageBytes=java.util.Base64.getDecoder().decode(base64String);FileoutputFile=null;FiletmpPathDir=newFile(tmpPath);tmpPathDir.mkdirs();StringfileP......
  • Java基础知识回顾1-面向对象
    一、Java特性1.面向对象众所周知,Java是一个面向对象的语言,万物皆对象。面向对象基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式。程序就是由无数个对象和......
  • Java学习—循环语句
    1、if...else语句Java中的条件语句允许程序根据条件的不同执行不同的代码块。一个if语句包含一个布尔表达式和一条或多条语句。if语句用于测试条件。它检查布尔条件为:true或false。如果布尔表达式的值为true,则执行if语句中的代码块,否则执行else语句块后面的代码。java中有......
  • Java 基础篇day07
    面向对象三大特征之二继承权限修饰符掌握四种权限修饰符的特点和作用修饰作用范围private只能在本类中访问,其他地方不能访问缺省(包访问权限):只能在本类中或者同一个包下的其他类中protect:在本类中,同一包下的其他类中,其他包下的子孙类中(在其他包中的子类中,即要继承的类,子......