标签:http 跨平台 能力 item cname bridge ret 分离 div
桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
桥接(Bridge)模式的优点是:
缺点是:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
实例(一):现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔的功能
实例(二):如果需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux、Unix等)上播放多种格式的视频文件,常见的视频格式包括MPEG、RMVB、AVI、WMV等。现使用桥接模式设计该播放器
可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。
桥接(Bridge)模式包含以下主要角色。
其结构图如图 1 所示。
桥接模式的代码如下:
package bridge; public class BridgeTest { public static void main(String[] args) { Implementor imple=new ConcreteImplementorA(); Abstraction abs=new RefinedAbstraction(imple); abs.Operation(); } } //实现化角色 interface Implementor { public void OperationImpl(); } //具体实现化角色 class ConcreteImplementorA implements Implementor { public void OperationImpl() { System.out.println("具体实现化(Concrete Implementor)角色被访问" ); } } //抽象化角色 abstract class Abstraction { protected Implementor imple; protected Abstraction(Implementor imple) { this.imple=imple; } public abstract void Operation(); } //扩展抽象化角色 class RefinedAbstraction extends Abstraction { protected RefinedAbstraction(Implementor imple) { super(imple); } public void Operation() { System.out.println("扩展抽象化(Refined Abstraction)角色被访问" ); imple.OperationImpl(); } }
程序的运行结果如下:
扩展抽象化(Refined Abstraction)角色被访问 具体实现化(Concrete Implementor)角色被访问
【例1】用桥接(Bridge)模式模拟女士皮包的选购。
分析:女士皮包有很多种,可以按用途分、按皮质分、按品牌分、按颜色分、按大小分等,存在多个维度的变化,所以采用桥接模式来实现女士皮包的选购比较合适。
本实例按用途分可选钱包(Wallet)和挎包(HandBag),按颜色分可选黄色(Yellow)和红色(Red)。可以按两个维度定义为颜色类和包类。。
颜色类(Color)是一个维度,定义为实现化角色,它有两个具体实现化角色:黄色和红色,通过 getColor() 方法可以选择颜色;包类(Bag)是另一个维度,定义为抽象化角色,它有两个扩展抽象化角色:挎包和钱包,它包含了颜色类对象,通过 getName() 方法可以选择相关颜色的挎包和钱包。
客户类通过 ReadXML 类从 XML 配置文件中获取包信息,并把选到的产品通过窗体显示出现,图 2 所示是其结构图。
程序代码如下:
package bridge; import java.awt.*; import javax.swing.*; public class BagManage { public static void main(String[] args) { Color color; Bag bag; color=(Color)ReadXML.getObject("color"); bag=(Bag)ReadXML.getObject("bag"); bag.setColor(color); String name=bag.getName(); show(name); } public static void show(String name) { JFrame jf=new JFrame("桥接模式测试"); Container contentPane=jf.getContentPane(); JPanel p=new JPanel(); JLabel l=new JLabel(new ImageIcon("src/bridge/"+name+".jpg")); p.setLayout(new GridLayout(1,1)); p.setBorder(BorderFactory.createTitledBorder("女士皮包")); p.add(l); contentPane.add(p, BorderLayout.CENTER); jf.pack(); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } //实现化角色:颜色 interface Color { String getColor(); } //具体实现化角色:黄色 class Yellow implements Color { public String getColor() { return "yellow"; } } //具体实现化角色:红色 class Red implements Color { public String getColor() { return "red"; } } //抽象化角色:包 abstract class Bag { protected Color color; public void setColor(Color color) { this.color=color; } public abstract String getName(); } //扩展抽象化角色:挎包 class HandBag extends Bag { public String getName() { return color.getColor()+"HandBag"; } } //扩展抽象化角色:钱包 class Wallet extends Bag { public String getName() { return color.getColor()+"Wallet"; } }package bridge;import javax.xml.parsers.*;
import org.w3c.dom.*; import java.io.*; class ReadXML { public static Object getObject(String args) { try { DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=dFactory.newDocumentBuilder(); Document doc; doc=builder.parse(new File("src/bridge/config.xml")); NodeList nl=doc.getElementsByTagName("className"); Node classNode=null; if(args.equals("color")) { classNode=nl.item(0).getFirstChild(); } else if(args.equals("bag")) { classNode=nl.item(1).getFirstChild(); } String cName="bridge."+classNode.getNodeValue(); Class<?> c=Class.forName(cName); Object obj=c.newInstance(); return obj; } catch(Exception e) { e.printStackTrace(); return null; } }
}
程序的运行结果如图 3 所示。
如果将 XML 配置文件按如下修改:
<?xml version="1.0" encoding="UTF-8"?> <config> <className>Red</className> <className>Wallet</className> </config>
则程序的运行结果如图 4 所示。
桥接模式通常适用于以下场景。
在软件开发中,有时桥接(Bridge)模式可与适配器模式联合使用。当桥接(Bridge)模式的实现化角色的接口与现有类的接口不一致时,可以在二者中间定义一个适配器将二者连接起来,其具体结构图如图 5 所示。
标签:http 跨平台 能力 item cname bridge ret 分离 div
原文地址:https://www.cnblogs.com/yuexiaoyun/p/11863325.html