当前位置: 首页 > news >正文 山西公司网站建设效果新零售网站建设 news 2025/10/31 19:55:23 山西公司网站建设效果,新零售网站建设,wordpress指定标签不同样式,鑫三科技网站设计一、桥接模式 1.1概述 桥接模式是一种结构型设计模式#xff0c;它的作用是将抽象部分和实现部分分离开来#xff0c;使它们能够独立地变化。这样#xff0c;抽象部分和实现部分可以分别进行扩展#xff0c;而不会相互影响。它是用组合关系代替继承关系来实现#xff0c;…一、桥接模式 1.1概述 桥接模式是一种结构型设计模式它的作用是将抽象部分和实现部分分离开来使它们能够独立地变化。这样抽象部分和实现部分可以分别进行扩展而不会相互影响。它是用组合关系代替继承关系来实现从而降低了抽象和实现这两个可变维度的耦合度。 在桥接模式中抽象部分和实现部分之间通过一个称为“桥”的接口进行连接。这个桥接口定义抽象部分所需要的所有方法而实现部分则实现这些方法。这种设计方式可以使得实现部分的变化不会对抽象部分造成影响因为抽象部分只依赖于桥接口而不依赖于具体的实现部分。 桥接模式通常使用在需要跨越多个平台或多个产品版本的场景中。它可以提高代码的可复用性和可维护性同时也可以使得系统更加灵活和可扩展。 现在有一个需求需要创建不同的图形并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系 我们可以发现有很多的类假如我们再增加一个形状或再增加一种颜色就需要创建更多的类。 试想在一个有多种可能会变化的维度的系统中用继承方式会造成类爆炸扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统我们此时可以考虑使用桥接模式。 1.2结构 桥接Bridge模式包含以下主要角色 抽象化Abstraction角色 定义抽象类并包含一个对实现化对象的引用。扩展抽象化Refined Abstraction角色 是抽象化角色的子类实现父类中的业务方法并通过组合关系调用实现化角色中的业务方法。实现化Implementor角色 定义实现化角色的接口供扩展抽象化角色调用。具体实现化Concrete Implementor角色 给出实现化角色接口的具体实现。 1.3实现 【例】视频播放器 需要开发一个跨平台视频播放器可以在不同操作系统平台如Windows、Mac、Linux等上播放多种格式的视频文件常见的视频格式包括RMVB、AVI、WMV等。该播放器包含了两个维度适合使用桥接模式。 类图如下 实现化Implementor角色 package com.yanyu.Bridge;//视频文件 public interface VideoFile {void decode(String fileName); }具体实现化Concrete Implementor角色 package com.yanyu.Bridge;//avi文件 public class AVIFile implements VideoFile {public void decode(String fileName) {System.out.println(avi视频文件 fileName);} }package com.yanyu.Bridge;//rmvb文件 public class REVBBFile implements VideoFile {public void decode(String fileName) {System.out.println(rmvb文件 fileName);} } 抽象化Abstraction角色 package com.yanyu.Bridge;//操作系统版本 public abstract class OperatingSystemVersion {protected VideoFile videoFile;public OperatingSystemVersion(VideoFile videoFile) {this.videoFile videoFile;}public abstract void play(String fileName); } 扩展抽象化Refined Abstraction角色 package com.yanyu.Bridge;//Windows版本 public class Windows extends OperatingSystemVersion {public Windows(VideoFile videoFile) {super(videoFile);}public void play(String fileName) {videoFile.decode(fileName);} } package com.yanyu.Bridge;//mac版本 public class Mac extends OperatingSystemVersion {public Mac(VideoFile videoFile) {super(videoFile);}public void play(String fileName) {videoFile.decode(fileName);} }客户端类 package com.yanyu.Bridge;//测试类 public class Client {public static void main(String[] args) {OperatingSystemVersion os new Windows(new AVIFile());os.play(战狼3);} } 好处 桥接模式提高了系统的可扩充性在两个变化维度中任意扩展一个维度都不需要修改原有系统。 如如果现在还有一种视频文件类型wmv我们只需要再定义一个类实现VideoFile接口即可其他类不需要发生变化。 实现细节对客户透明 1.4应用场景 适合应用场景 如果你想要拆分或重组一个具有多重功能的庞杂类 例如能与多个数据库服务器进行交互的类 可以使用桥接模式。类的代码行数越多 弄清其运作方式就越困难 对其进行修改所花费的时间就越长。 一个功能上的变化可能需要在整个类范围内进行修改 而且常常会产生错误 甚至还会有一些严重的副作用。桥接模式可以将庞杂类拆分为几个类层次结构。 此后 你可以修改任意一个类层次结构而不会影响到其他类层次结构。 这种方法可以简化代码的维护工作 并将修改已有代码的风险降到最低。 1.5JDK源码解析 桥接模式Bridge Pattern是一种结构型设计模式它将抽象与实现分离使它们可以独立变化。在桥接模式中抽象和实现可以分别在两个不同的类层次结构中定义而通过组合的方式将它们联系起来。这样做的好处是可以减少继承带来的耦合问题提高系统的灵活性和可扩展性。 在 JDK 中桥接模式的应用非常广泛下面我们分别来看几个典型的例子 1. JDBC 在 JDBC 中数据访问 API 和数据库驱动实现是分离的。数据访问 API 是一组接口和类定义了数据库操作的抽象方法和常量。而具体的数据库驱动实现则是一组不同的 jar 包每个包对应一种数据库的不同驱动实现。这样设计的好处是可以实现代码的复用将代码的改动范围限定在实现层次结构中不影响客户端的使用。 2. AWT 在 AWT 中抽象窗口工具包Abstract Window Toolkit简称 AWT提供了一系列抽象类和接口用于实现和显示图形界面。而具体的 GUI 组件实现则是由不同的操作系统提供的。比如Windows 提供的 AWT 组件实现和 Linux 提供的 AWT 组件实现是不同的但它们都可以通过抽象类和接口来实现统一的调用方式从而保证了跨平台的兼容性。 3. java.util.logging 在 java.util.logging 中抽象日志记录器Logger定义了一组抽象方法和常量用于记录日志信息。而具体的日志记录实现则是通过不同的日志 Handler 实现的。比如FileHandler、ConsoleHandler、StreamHandler 等它们都继承自抽象类 AbstractHandler实现了具体的日志记录方式。这样设计的好处是可以将日志记录器与具体记录方式分离提高代码的可扩展性和灵活性。 总之桥接模式是一种非常实用的设计模式它可以将抽象和实现分离使它们可以独立变化。在 JDK 中有很多典型的桥接模式应用这些应用不仅为我们提供了很好的学习案例还可以帮助我们更好地理解桥接模式的思想和作用。 二、外观模式 2.1概述 外观模式Facade Pattern是一种结构型设计模式它为一组复杂的子系统接口提供了一个统一的接口以方便客户端使用。外观模式通过将复杂的系统封装在一个简单的外观对象中简化了客户端的调用过程同时隐藏了系统的复杂性。 外观模式通常会定义一个简单的高层接口这个接口封装了系统的所有复杂流程和方法调用并将这些流程和方法调用转化为若干个简单的方法供客户端直接调用。这样客户端就不需要了解系统的内部实现细节也不需要知道哪些子系统需要协同工作才能完成一个请求。 总的来说外观模式提供了一种简单的方式来使用复杂系统并使得系统更加易于使用和维护。外观Facade模式是“迪米特法则”的典型应用 2.2 结构 外观Facade模式包含以下主要角色 外观Facade角色为多个子系统对外提供一个共同的接口。子系统Sub System角色实现系统的部分功能客户可以通过外观角色访问它。 2.3实现 【例】智能家电控制 小明的爷爷已经60岁了一个人在家生活每次都需要打开灯、打开电视、打开空调睡觉时关闭灯、关闭电视、关闭空调操作起来都比较麻烦。所以小明给爷爷买了智能音箱可以通过语音直接控制这些智能家电的开启和关闭。类图如下 外观Facade角色 package com.yanyu.Facade;//智能音箱 public class SmartAppliancesFacade {//定义三个私有属性分别代表三种电器设备private Light light;private TV tv;private AirCondition airCondition;//构造方法初始化三种电器设备的对象public SmartAppliancesFacade() {light new Light();tv new TV();airCondition new AirCondition();}//公共方法根据语音指令控制电器的开关public void say(String message) {//如果语音指令包含“打开”则调用on()方法if(message.contains(打开)) {on();//如果语音指令包含“关闭”则调用off()方法} else if(message.contains(关闭)) {off();//否则打印提示信息} else {System.out.println(我还听不懂你说的);}}//私有方法起床后一键开电器private void on() {//打印提示信息System.out.println(起床了);//调用三种电器设备的on()方法分别开启灯、电视和空调light.on();tv.on();airCondition.on();}//私有方法睡觉一键关电器private void off() {//打印提示信息System.out.println(睡觉了);//调用三种电器设备的off()方法分别关闭灯、电视和空调light.off();tv.off();airCondition.off();} }定义了一个智能音箱类作为三种电器设备的门面提供了一个统一的接口使得客户端可以通过语音指令来控制电器的开关而不需要了解电器的具体实现细节。外观模式可以简化客户端与子系统之间的交互降低系统的复杂度和耦合度 子系统Sub System角色 package com.yanyu.Facade;//灯类 public class Light {public void on() {System.out.println(打开了灯....);}public void off() {System.out.println(关闭了灯....);} } package com.yanyu.Facade;//电视类 public class TV {public void on() {System.out.println(打开了电视....);}public void off() {System.out.println(关闭了电视....);} }package com.yanyu.Facade;//空调类 public class AirCondition {public void on() {System.out.println(打开了空调....);}public void off() {System.out.println(关闭了空调....);} }客户端类 package com.yanyu.Facade;//测试类 public class Client {public static void main(String[] args) {//创建外观对象SmartAppliancesFacade facade new SmartAppliancesFacade();//客户端直接与外观对象进行交互facade.say(打开家电);facade.say(关闭家电);} } 对分层结构系统构建时使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。当一个复杂系统的子系统很多时外观模式可以为系统设计一个简单的接口供外界访问。当客户端与多个子系统之间存在很大的联系时引入外观模式可将它们分离从而提高子系统的独立性和可移植性。 2.4应用场景 对分层结构系统构建时使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。当一个复杂系统的子系统很多时外观模式可以为系统设计一个简单的接口供外界访问。当客户端与多个子系统之间存在很大的联系时引入外观模式可将它们分离从而提高子系统的独立性和可移植性。 三、 桥接模式实验 任务描述 某软件公司欲开发一个数据转换工具可以将数据库中的数据转换成多种文件格式例如 TXT、XML、PDF 等格式同时该工具需要支持多种不同的数据库。 本关任务用桥接模式对模拟程序进行框架搭建如图。 实现方式 明确类中独立的维度。 独立的概念可能是 抽象/平台 域/基础设施 前端/后端或接口/实现。 了解客户端的业务需求 并在抽象基类中定义它们。 确定在所有平台上都可执行的业务。 并在通用实现接口中声明抽象部分所需的业务。 为你域内的所有平台创建实现类 但需确保它们遵循实现部分的接口。 在抽象类中添加指向实现类型的引用成员变量。 抽象部分会将大部分工作委派给该成员变量所指向的实现对象。 如果你的高层逻辑有多个变体 则可通过扩展抽象基类为每个变体创建一个精确抽象。 客户端代码必须将实现对象传递给抽象部分的构造函数才能使其能够相互关联。 此后 客户端只需与抽象对象进行交互 无需和实现对象打交道。 编程要求 根据提示在右侧编辑器 Begin-End 内补充 DataHandler.java、FileConvertor.java、PDFConvertor.java、XMLConvertor.java 和 TXTConvertor.java 文件的代码。 测试说明 平台会自动从 xml 文件中读取内容然后对你编写的代码进行测试 预期输出 从Oracle数据库中读取数据 转换成PDF格式的数据 预期输出 从SQLServer数据库中读取数据 转换成TXT格式的数据 客户端类 package step1;import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File;public class XMLUtils {//定义一个静态方法根据传入的标签名返回对应的类的实例对象public static Object getBean(String name) {try {//创建DOM文档对象DocumentBuilderFactory dFactory DocumentBuilderFactory.newInstance();DocumentBuilder builder dFactory.newDocumentBuilder();Document doc;//解析XML文件获取Document对象doc builder.parse(new File(/data/workspace/myshixun/src/config.xml));//获取包含类名的文本结点NodeList nl doc.getElementsByTagName(name);Node classNode nl.item(0).getFirstChild();//获取结点的值即类名String cName classNode.getNodeValue();//通过类名生成实例对象并将其返回Class c Class.forName(cName);Object obj c.getDeclaredConstructor().newInstance();return obj;}catch(Exception e) {//捕获并打印异常e.printStackTrace();return null;}} }这段代码是一个XML工具类它使用了DOM方式来解析XML文件获取其中的类名并通过反射机制来创建类的实例对象。这样可以实现配置文件和代码的分离提高代码的可维护性和可扩展性 package step1;public class Client {public static void main(String[] args) {//创建一个抽象化角色的对象通过XML配置文件获取其具体实现类的名称FileConvertor fileConvertor (FileConvertor) XMLUtils.getBean(className1);//将一个实现化角色的对象注入到抽象化角色中通过XML配置文件获取其具体实现类的名称fileConvertor.setDataHandler((DataHandler) XMLUtils.getBean(className2));//调用抽象化角色的方法实现对文件的转换fileConvertor.translate();} }实现化角色 package step1;/********** Begin *********/ //定义一个抽象的数据处理类作为实现化角色 public abstract class DataHandler{//定义一个抽象的数据读取方法由子类实现public abstract void readData(); }/********** End *********/具体实现化角色 package step1;//定义一个从Oracle数据库中读取数据的类继承自DataHandler类作为具体实现化角色 public class OracleHandler extends DataHandler{//重写父类的抽象方法实现具体的数据读取操作Overridepublic void readData() {System.out.println(从Oracle数据库中读取数据);} }package step1;public class SQLServerHandle extends DataHandler{Overridepublic void readData() {System.out.println(从SQLServer数据库中读取数据);} }抽象化角色 package step1;/********** Begin *********/ //定义一个抽象的文件转换类作为抽象化角色 public abstract class FileConvertor{//定义一个受保护的数据处理类的引用作为实现化角色的接口protected DataHandler handler;//定义一个公共的方法用于设置数据处理类的对象实现桥接的过程public void setDataHandler(DataHandler handler) {this.handler handler;}//定义一个抽象的方法用于转换文件由子类实现调用数据处理类的方法public abstract void translate();}/********** End *********/扩展抽象类 package step1;//定义一个PDF文件转换类继承自FileConvertor类作为扩展抽象化角色 public class PDFConvertor extends FileConvertor{//重写父类的抽象方法实现具体的文件转换操作Overridepublic void translate() {/********** Begin *********///调用实现化角色的方法读取数据handler.readData();/********** End *********///打印提示信息表示转换成PDF格式的数据System.out.println(转换成PDF格式的数据);} }package step1;public class TXTConvertor extends FileConvertor{Overridepublic void translate() {/********** Begin *********/handler.readData();/********** End *********/System.out.println(转换成TXT格式的数据);} }package step1;public class XMLConvertor extends FileConvertor{Overridepublic void translate() {/********** Begin *********/handler.readData();/********** End *********/System.out.println(转换成XML格式的数据);} } 文章转载自: http://www.morning.c7622.cn.gov.cn.c7622.cn http://www.morning.mwkwg.cn.gov.cn.mwkwg.cn http://www.morning.hqwxm.cn.gov.cn.hqwxm.cn http://www.morning.ldmtq.cn.gov.cn.ldmtq.cn http://www.morning.jhxdj.cn.gov.cn.jhxdj.cn http://www.morning.mspqw.cn.gov.cn.mspqw.cn http://www.morning.nffwl.cn.gov.cn.nffwl.cn http://www.morning.bpmdq.cn.gov.cn.bpmdq.cn http://www.morning.jfjpn.cn.gov.cn.jfjpn.cn http://www.morning.tbkqs.cn.gov.cn.tbkqs.cn http://www.morning.fmswb.cn.gov.cn.fmswb.cn http://www.morning.rwzmz.cn.gov.cn.rwzmz.cn http://www.morning.xltwg.cn.gov.cn.xltwg.cn http://www.morning.lbhck.cn.gov.cn.lbhck.cn http://www.morning.rhmpk.cn.gov.cn.rhmpk.cn http://www.morning.xltwg.cn.gov.cn.xltwg.cn http://www.morning.wqbfd.cn.gov.cn.wqbfd.cn http://www.morning.ohmyjiu.com.gov.cn.ohmyjiu.com http://www.morning.lmzpk.cn.gov.cn.lmzpk.cn http://www.morning.bsqkt.cn.gov.cn.bsqkt.cn http://www.morning.fkgcd.cn.gov.cn.fkgcd.cn http://www.morning.jcwt.cn.gov.cn.jcwt.cn http://www.morning.rtlth.cn.gov.cn.rtlth.cn http://www.morning.rqqn.cn.gov.cn.rqqn.cn http://www.morning.fkrzx.cn.gov.cn.fkrzx.cn http://www.morning.rzrbw.cn.gov.cn.rzrbw.cn http://www.morning.kmqlf.cn.gov.cn.kmqlf.cn http://www.morning.ghgck.cn.gov.cn.ghgck.cn http://www.morning.wrtxk.cn.gov.cn.wrtxk.cn http://www.morning.gtxrw.cn.gov.cn.gtxrw.cn http://www.morning.pwksz.cn.gov.cn.pwksz.cn http://www.morning.qlrwf.cn.gov.cn.qlrwf.cn http://www.morning.rbffj.cn.gov.cn.rbffj.cn http://www.morning.ybshj.cn.gov.cn.ybshj.cn http://www.morning.tnbsh.cn.gov.cn.tnbsh.cn http://www.morning.wnbqy.cn.gov.cn.wnbqy.cn http://www.morning.mdwlg.cn.gov.cn.mdwlg.cn http://www.morning.zgdnz.cn.gov.cn.zgdnz.cn http://www.morning.trkhx.cn.gov.cn.trkhx.cn http://www.morning.rlxg.cn.gov.cn.rlxg.cn http://www.morning.bqppr.cn.gov.cn.bqppr.cn http://www.morning.gjssk.cn.gov.cn.gjssk.cn http://www.morning.dmhs.cn.gov.cn.dmhs.cn http://www.morning.qnxtz.cn.gov.cn.qnxtz.cn http://www.morning.ghqyr.cn.gov.cn.ghqyr.cn http://www.morning.jwrcz.cn.gov.cn.jwrcz.cn http://www.morning.jfxdy.cn.gov.cn.jfxdy.cn http://www.morning.lfqtp.cn.gov.cn.lfqtp.cn http://www.morning.yqsq.cn.gov.cn.yqsq.cn http://www.morning.mydgr.cn.gov.cn.mydgr.cn http://www.morning.cbchz.cn.gov.cn.cbchz.cn http://www.morning.lmdkn.cn.gov.cn.lmdkn.cn http://www.morning.qrpdk.cn.gov.cn.qrpdk.cn http://www.morning.kcnjz.cn.gov.cn.kcnjz.cn http://www.morning.xqspn.cn.gov.cn.xqspn.cn http://www.morning.bfcrp.cn.gov.cn.bfcrp.cn http://www.morning.tturfsoc.com.gov.cn.tturfsoc.com http://www.morning.pgcmz.cn.gov.cn.pgcmz.cn http://www.morning.lsmnn.cn.gov.cn.lsmnn.cn http://www.morning.qsy41.cn.gov.cn.qsy41.cn http://www.morning.dbnrl.cn.gov.cn.dbnrl.cn http://www.morning.twhgn.cn.gov.cn.twhgn.cn http://www.morning.rdxnt.cn.gov.cn.rdxnt.cn http://www.morning.zwzwn.cn.gov.cn.zwzwn.cn http://www.morning.dbbcq.cn.gov.cn.dbbcq.cn http://www.morning.hctgn.cn.gov.cn.hctgn.cn http://www.morning.hwtb.cn.gov.cn.hwtb.cn http://www.morning.qwyms.cn.gov.cn.qwyms.cn http://www.morning.zlqyj.cn.gov.cn.zlqyj.cn http://www.morning.zrrgx.cn.gov.cn.zrrgx.cn http://www.morning.gbcxb.cn.gov.cn.gbcxb.cn http://www.morning.nllst.cn.gov.cn.nllst.cn http://www.morning.yqjjn.cn.gov.cn.yqjjn.cn http://www.morning.xoaz.cn.gov.cn.xoaz.cn http://www.morning.twdwy.cn.gov.cn.twdwy.cn http://www.morning.rwyd.cn.gov.cn.rwyd.cn http://www.morning.gfhng.cn.gov.cn.gfhng.cn http://www.morning.nqbs.cn.gov.cn.nqbs.cn http://www.morning.kpmxn.cn.gov.cn.kpmxn.cn http://www.morning.wctqc.cn.gov.cn.wctqc.cn 查看全文 http://www.tj-hxxt.cn/news/266057.html 相关文章: 文化传媒网站封面东莞长安做网站公司 怎么在word上做超链接网站金华市建设监理协会网站 网站建设平台市场wordpress组件开发 海安网站建设家装室内设计案例分析图文 网站设计 中国风小程序注册推广 郑州网站建设制作费用wordpress 关联文章 二级域名网站怎么投广告北京高端网站建设公司哪家好 建设部网站 光纤到户墨子学院网站建设vip课程 网站程序模块安徽省住房和城乡建设厅门户网站 搜款网站一起做网店免费的招标网有哪些 旅行社网站建设方案书dedecms漏洞 爱站网域名查询西安网站搭建 怎嘛做网站南京市住宅建设总公司网站 山西推广型网站制作wordpress 主页 怎么建设网站最便宜wordpress 5.2.2中文版 上海市网站制作在putty做网站要拷贝什么 市辖区郑州网站建设网站后台添加图片显示不了 抚顺您做煮火锅网站推广计划表格 我的网站突然打不开了怎么回事啊长沙专业网站设计公司 宣武上海网站建设福州mip网站建设 制作游戏网站公司潍坊市建设一体化平台网站 医疗网站建设哪个好用小伟破解WordPress主题 网站使用前流程wordpress 新手 网站添加地图导航物联网方案 晚上睡不着正能量网站上海百度推广代理商 企业微网站建站微网站功能列表 免费网站大全下载彭阳门户网站建设 歌曲网站源码浙江建设局图审网站 遵义市住房和城乡建设局官方网站上海最专业的seo公司 电子商务网站 注意长沙岳麓区网站开发