设计模式示例_桥梁设计模式示例

设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。

在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 !

目录

1.简介 2.什么是桥接模式 3.解决问题 4.桥接模式的使用 5.下载源代码

1.简介

Sec Security System是一家安全和电子公司,主要生产和组装汽车产品。 它提供所需的任何汽车电子或安全系统,从安全气囊到GPS跟踪系统,倒车停车系统等。大型汽车公司在其汽车中使用其产品。 该公司使用定义明确的面向对象方法,使用仅由他们开发和维护的软件来跟踪其产品。 他们得到汽车,为其生产系统,并将其组装到汽车中。

最近,他们从BigWheel(汽车公司)获得了新订单,为他们的新xz模型生产中央锁和齿轮锁系统。 为此,他们正在创建一个新的软件系统。 他们首先创建了一个新的抽象类CarProductSecurity,在其中保留了一些特定于汽车的方法和一些他们认为对所有安全产品都通用的功能。 然后,他们扩展了该类并创建了两个不同的子类,分别称为BigWheelXZCentralLocking和BigWheelXZGearLocking。 类图如下所示:

图1

图1

不久之后,另一家汽车公司Motoren要求他们为其lm模型生产一种新的中央锁和齿轮锁系统。 由于不能在不同汽车的两种型号中使用相同的安全系统,因此Sec安全系统已为其开发了新系统,并且为MotorenLMCentralLocking和MotorenLMGearLocking创建了新类,它们也扩展了CarProductSecurity类。

现在,新的类图如下所示:

图2

图2

到目前为止,还算不错,但是如果另一家汽车公司需要另一套新的中央锁定和齿轮锁定系统会怎样? 一个需要为其创建另外两个新类。 这种设计将为每个系统创建一个类别,或者更糟的是,如果为这两个汽车公司中的每个公司都生产倒车停车系统,则将为每个汽车公司另外创建两个新类别。

子类过多的设计不灵活且难以维护。 继承还将实现永久地绑定到抽象,这使得很难独立地修改,扩展和重用抽象和实现。

请注意,汽车和产品应独立变化,以使软件系统易于扩展和重用。

桥接设计模式可以解决此问题,但在此之前,让我们首先了解有关桥接模式的一些细节。

2.什么是桥接模式

桥接模式的目的是将抽象与其实现分离,以便二者可以独立变化。 它将抽象和实现置于两个不同的类层次结构中,以便可以独立地扩展它们。

图3

图3

桥接模式的组件包括一个抽象,完善的抽象,一个实现程序和具体的实现程序。

抽象定义了抽象的接口,还维护了对类型实现者对象的引用,抽象和实现者之间的链接称为桥。

精致抽象扩展了抽象定义的接口。

实现者为实现类提供接口(具体实现者)。

然后,具体实施者实现实施者接口并定义其具体实施。

桥接模式将接口与实现分离。 结果,实现未永久绑定到接口。 可以在运行时配置抽象的实现。 它还消除了对实现的编译时依赖性。 更改实现类不需要重新编译抽象类及其客户端。 客户端只需要了解抽象,就可以对它们隐藏实现。

3.解决问题

除了在上面讨论的问题中为每个汽车模型的每种产品创建子类之外,我们还可以将设计分为两个不同的层次结构。 一个接口用于产品,该接口将用作实施者,另一个接口是汽车类型的抽象。 实施者将由具体实施者实施,并为其提供实施。 另一方面,将通过更精细的抽象来扩展抽象。

图4

图4

package com.javacodegeeks.patterns.bridgepattern;public interface Product {public String productName();public void produce();
}

实现者Product具有方法produce() ,具体实现者将使用该方法为其提供具体功能。 该方法将产生产品的基本模型,在对该汽车模型进行特定修改后,该模型可以与任何汽车模型一起使用。

package com.javacodegeeks.patterns.bridgepattern;public class CentralLocking implements Product{private final String productName;public CentralLocking(String productName){this.productName = productName;}@Overridepublic String productName() {return productName;}@Overridepublic void produce() {System.out.println("Producing Central Locking System");}}package com.javacodegeeks.patterns.bridgepattern;public class GearLocking implements Product{private final String productName;public GearLocking(String productName){this.productName = productName;}@Overridepublic String productName() {return productName;}@Overridepublic void produce() {System.out.println("Producing Gear Locking System");}}

两种不同的具体实现者为Product实现者提供实现。

现在是抽象类,即Car类,其中包含产品类型的引用,并提供了两种抽象方法produceProduct()assemble()

package com.javacodegeeks.patterns.bridgepattern;public abstract class Car {private final Product product;private final String carType;public Car(Product product,String carType){this.product = product;this.carType = carType;}public abstract void assemble();public abstract void produceProduct();public void printDetails(){System.out.println("Car: "+carType+", Product:"+product.productName());}
}

Car的子类将为方法assemble()produceProduct()提供具体而具体的实现。

package com.javacodegeeks.patterns.bridgepattern;public class BigWheel extends Car{private final Product product;private final String carType;public BigWheel(Product product, String carType) {super(product, carType);this.product = product;this.carType = carType;}@Overridepublic void assemble() {System.out.println("Assembling "+product.productName()+" for "+carType);}@Overridepublic void produceProduct() {product.produce();System.out.println("Modifing product "+product.productName()+" according to "+carType);}}package com.javacodegeeks.patterns.bridgepattern;public class Motoren extends Car{private final Product product;private final String carType;public Motoren(Product product, String carType) {super(product, carType);this.product = product;this.carType = carType;}@Overridepublic void assemble() {System.out.println("Assembling "+product.productName()+" for "+carType);}@Overridepublic void produceProduct() {product.produce();System.out.println("Modifing product "+product.productName()+" according to "+carType);}}

现在,让我们测试示例。

package com.javacodegeeks.patterns.bridgepattern;public class TestBridgePattern {public static void main(String[] args) {Product product = new CentralLocking("Central Locking System");Product product2 = new GearLocking("Gear Locking System");Car car = new BigWheel(product , "BigWheel xz model");car.produceProduct();car.assemble();car.printDetails();System.out.println();car = new BigWheel(product2 , "BigWheel xz model");car.produceProduct();car.assemble();car.printDetails();System.out.println("-----------------------------------------------------");car = new Motoren(product, "Motoren lm model");car.produceProduct();car.assemble();car.printDetails();System.out.println();car = new Motoren(product2, "Motoren lm model");car.produceProduct();car.assemble();car.printDetails();}}

上面的示例将产生以下输出:

Producing Central Locking System
Modifing product Central Locking System according to BigWheel xz model
Assembling Central Locking System for BigWheel xz model
Car: BigWheel xz model, Product:Central Locking SystemProducing Gear Locking System
Modifing product Gear Locking System according to BigWheel xz model
Assembling Gear Locking System for BigWheel xz model
Car: BigWheel xz model, Product:Gear Locking System
-----------------------------------------------------
Producing Central Locking System
Modifing product Central Locking System according to Motoren lm model
Assembling Central Locking System for Motoren lm model
Car: Motoren lm model, Product:Central Locking SystemProducing Gear Locking System
Modifing product Gear Locking System according to Motoren lm model
Assembling Gear Locking System for Motoren lm model
Car: Motoren lm model, Product:Gear Locking System

4.桥接模式的使用

在以下情况下,您应该使用桥接模式:

  1. 您要避免抽象及其实现之间的永久绑定。 例如,当必须在运行时选择或切换实现时,可能就是这种情况。
  2. 抽象及其实现都应通过子类扩展。 在这种情况下,桥接模式可让您组合不同的抽象和实现,并分别对其进行扩展。
  3. 对抽象实现的更改不应对客户端产生任何影响; 也就是说,它们的代码不必重新编译。
  4. 您想要在多个对象之间共享一个实现(也许使用引用计数),并且这个事实应该对客户端隐藏。

5.下载源代码

这是关于桥梁模式的课程。 您可以在此处下载源代码: BridgePattern-Project

翻译自: https://www.javacodegeeks.com/2015/09/bridge-design-pattern.html

设计模式示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数值分析 使用c语言 源码_分析源码,学会正确使用 Java 线程池

在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我们有必要更多地去关注线程池的执行情况,包括异常的处理和分析等。本文主要聚焦在如何正确使用线程池上,以及提供一些实用的建议。文中会稍微涉及到一些线…

设计模式示例_状态设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

cam350 不能打开光绘文件_如何在CAM350中导入Allegro光绘

内容简介:本人之前遇到过 CAM350 导入 Allegro 格式光绘后钻孔偏移、异型孔不显示的问题,捣鼓过之后找到一个方法,在 Allegro 群友的建议下制作该文档进行适当的说明。1. 导入 Gerber 文件鉴于手工导入 Gerber 文件需要逐层设置,过…

d3js mysql_D3.js入门指南

近期略有点诸事不顺,趁略有闲余之时,玩起D3.js。之前实际项目中主要是用各种chart如hightchart、echarts等,这些图形库玩起来貌都是完美的,一切皆可配置,但几年前接触了D3之后,觉得前面那chart类库局限的地…

layui templet格式化_layui使用templet格式化表格数据的方法

增加js/*---------------------格式化时间开始--------------------------*///对Date的扩展,将 Date 转化为指定格式的String//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,//年(y)可以用 1-4 个占位符,毫秒(S)只能用…

设计模式示例_代理设计模式示例

设计模式示例本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因,并了解何时以及如何应用模式中的每一个。 在这里查看 &#x…

mysql insert 字符集_有关 MySQL 字符集的注意事项-爱可生

本文关键字:字符集、建库建表一、数据库和字符集1. 建库时指定创建数据库时,显式指定字符集和排序规则,同时,当切换到当前数据库后,参数 character_set_database,collation_database 分别被覆盖为当前显式指…

c#发送讯息_企业讯息

c#发送讯息本文是我们名为“ EAI的Spring集成 ”的学院课程的一部分。 在本课程中,向您介绍了企业应用程序集成模式以及Spring Integration如何解决它们。 接下来,您将深入研究Spring Integration的基础知识,例如通道,转换器和适…

java cr_WildFly 10 CR 2发布– Java EE 7,Java 8,Hibernate 5,JavaScript支持热重载

java cr昨天,WildFly团队发布了最新版本的WildFly 10 。 CR2很可能是预计于十月份发布最终版本之前的最后一个版本。 即使主要支持的Java EE规范是7,WildFly 8和WildFly 9也提供了许多新功能,而WildFly 9和WildFly 9现在制作了三个服务器版本…

侬娜·杰尔_杰尔·地狱

侬娜杰尔什么是JAR地狱? (或者是classpath地狱?还是依赖地狱?)在考虑使用Maven或OSGi等现代开发工具时,哪些方面仍然有意义? 有趣的是,似乎没有对这些问题的结构化答案(…

Mysql运行在内核空间_思考mysql内核之初级系列6—innodb文件管理 | 学步园

在上一篇里面,bingxi和alex思考了information_schema,这个一直在innodb外围打转。没有进入到innodb的内部。在后续的文章中,以innodb的为主,逐个思考。Bingxi和alex今天了解了fil文件管理。对应的文件为:D:/mysql-5.1.…

pcl_openmap_OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分

pcl_openmap1.简介 在第一个教程中,我们创建了一个基本的OpenMap GIS应用程序,该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在该教程中,我们使用了以下OpenM…

mysql7.5安装教程_CentOS7.5下yum安装MySQL8图文教程

卸载MariaDB1.列出所有安装的MariaDB rpm 包rpm -qa | grep mariadb2.强制卸载rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64安装MySQL1. 环境CentOS7.52. 获取MySQL最新版 rpm包yum仓库下载MySQLyum localinstall https://repo.mysql.com//mysql80-community-release-e…

mysql和sqlserver分页的区别_关于SQLServer和MySQL 查询分页语句区别

首先来定义几个要用到的参数(例子)t_user数据表int currentPage ; //当前页int pageRecord ; //每页显示记录数关于SqlServer数据库分页SQL语句为:String sql "select top "pageRecord " * from t_user where id not in (select top "(currentPage-1)*pag…

java 微型数据库_Java 9代码工具:使用Java微型基准测试工具的实践会话

java 微型数据库用肉眼看,基准测试似乎只是确定执行某些代码需要花费多长时间的简单问题。 但是,通常情况下,这是幼稚的方法。 提供具有准确和可重复结果的有意义的基准并非易事。 在本文中,我们将向您介绍OpenJDK代码工具项目&a…

mysql快速随机_MySQL随机取数据最高效的方法

mysql随机取数据最高效率的方法发现在SQL语句里有一个 ORDER BY rand() 这样的一个语句,这个说是用着方便,但是效率实在是太低了,于是我用了以下的方法来优化,就是用JOIN表的方法来达到这个取随机数据行的方法,你可以用…

部署被测软件应用和中间件_使用FlexDeploy对融合中间件应用程序进行自动化软件测试...

部署被测软件应用和中间件自动化软件测试是任何软件组织都必须执行的强制性活动之一,以保证其产品质量。 但是,此过程通常变得相当复杂,尤其是涉及由多个不同部分组成的现代复杂系统的自动化测试时。 所有这些部分都基于不同的技术&#xff0…

投行数据_投行对Java的二十大核心访谈问答

投行数据这是在金融领域(主要是在大型投资银行)共享Java核心访谈问题和答案的新系列。 在JP Morgan,Morgan Stanley,Barclays或Goldman Sachs上会问许多这些Java面试问题。 银行主要从多线程 , 集合 ,序列化…

primefaces_通过OmniFaces缓存组件以编程方式缓存PrimeFaces图表

primefaces在这篇文章中&#xff0c;您将看到如何结合PrimeFaces和OmniFaces获得可缓存的图表。 为了使事情变得简单&#xff0c;我们将使用PrimeFaces 折线图。 对于这种图表&#xff0c;我们可以在页面中使用<p&#xff1a;chart />标签和一个简单的托管bean。 因此&am…

hmailserver mysql密码_第二步:点晴MIS系统Email模块hMailServer数据库连接配置指引

点击&#xff1a;windows系统-》开始-》所有程序-》hmailserver-》hMailServer Database Setup&#xff0c;在弹出的对话框中输入默认管理密码“clicksun2010”&#xff0c;进入后按照以下步骤操作&#xff1a;输入登陆密码&#xff1a;clicksun2010&#xff0c;务必使用这个密…