赞
踩
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立的变化。它是一种对象结构型模式,又称为炳体(Handler and Body)模式或接口(Interface)模式。
桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。
【GOF95】在提出桥接模式的时候指出,桥梁模式的用意是“将抽象化(Abstraction)与实现化(Iplementation)脱耦,使得二者可以独立的变化”。这句话有三个关键词,也就是抽象化、实现化和脱耦。将类与类之间继承的关系,变为抽象类或者接口与接口之间的关联关系,实现了抽象化与实现化的脱耦
。
存在于多个实体中的共同概念性联系,就是抽象化。作为一个过程,抽象化就是忽略一些信息,从而把不同的实体当做同样的实体对待。
抽象化给出的具体实现,就是实现化。
所谓耦合,就是两个实体的行为的某种强关联。而将它们的强关联去掉,就是耦合的解脱,或称脱耦。在这里,脱耦是指将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改成弱关联。
将两个角色之间的继承关系改成聚合关系,就是将它们之间的强关联改换成为弱关联。因此,桥接模式中所谓的脱耦,就是指在一个软件系统的抽象换和实现化之间使用组合/聚合关系而不是继承关系,从而是两者可以相对独立的变化。这就是桥接模式的用意。
桥接模式是对象的结构模式,又称为炳体模式或接口模式。
下图所示就是一个实现了桥接模式的示意性系统的结构图。
可以看出,这个系统含有两个等级结构,也就是:
桥接模式所涉及到的角色有:
抽象化(Abstraction)角色
:抽象化给出的定义,并保存一个对实现化对象的引用。修正抽象化(Refined Abstraction)角色
:拓展抽象化角色,改变和修正父类对抽象化的定义。实现化(Implementor)角色
:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上。这两个接口可以非常不一样。实现化角色相当于只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。具体实现化(Concrete Implementor)角色
:这个角色给出实现化角色接口的具体实现。public interface Implementor {
public void operationImpl();
}
public class ConcreteImplementor implements Implementor {
@Override
public void operationImpl() {
//具体的实现
}
}
public abstract class Abstraction {
protected Implementor impl;
public void setImpl(Implementor impl) {
this.impl = impl;
}
public abstract void operation();
}
/**
* @Description 修正抽象化
* @Author Administrator
* @Date 2019/10/30 16:24
**/
public class RefinedAbstraction extends Abstraction {
@Override
public void operation() {
impl.operationImpl();
}
}
public interface Color {
void bepaint(String penType, String name);
}
public abstract class Pen {
protected Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw(String name);
}
public class SmallPen extends Pen {
@Override
public void draw(String name) {
String penType = "小号毛笔绘制";
this.color.bepaint(penType, name);
}
}
public class MiddlePen extends Pen {
@Override
public void draw(String name) {
String penType = "中号毛笔绘制";
this.color.bepaint(penType, name);
}
}
public class BigPen extends Pen {
@Override
public void draw(String name) {
String penType = "大号毛笔绘制";
this.color.bepaint(penType, name);
}
}
public class Green implements Color {
@Override
public void bepaint(String penType, String name) {
System.out.println(penType + "绿色的" + name + ".");
}
}
public class Red implements Color{
@Override
public void bepaint(String penType, String name) {
System.out.println(penType + "红色的"+ name + ".");
}
}
配置文件configPen.xml
<?xml version="1.0"?>
<config>
<className>com.sjj.advance.designmodel.结构型.bridge.test2.Red</className>
<className>com.sjj.advance.designmodel.结构型.bridge.test2.SmallPen</className>
</config>
public class XMLUtilPen { //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象 public static Object getBean(String args) { try { //创建文档对象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("conf/configPen.xml")); NodeList nl = null; Node classNode = null; String cName = null; nl = doc.getElementsByTagName("className"); if (args.equals("color")) { //获取包含类名的文本节点 classNode = nl.item(0).getFirstChild(); } else if (args.equals("pen")) { //获取包含类名的文本节点 classNode = nl.item(1).getFirstChild(); } cName = classNode.getNodeValue(); //通过类名生成实例对象并将其返回 Class c = Class.forName(cName); Object obj = c.newInstance(); return obj; } catch (Exception e) { e.printStackTrace(); return null; } } }
public class Client {
public static void main(String[] args) {
Color color;
Pen pen;
color = (Color) XMLUtilPen.getBean("color");
pen = (Pen) XMLUtilPen.getBean("pen");
pen.setColor(color);
pen.draw("鲜花");
}
}
运行结果
小号毛笔绘制红色的鲜花.
理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立的变化。
指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系
,从而使两者可以相对独立地变化,这就是桥接模式的用意。在以下情况下可以使用桥接模式:
(1)Java语言通过Java虚拟机实现了平台的无关性
(2)JDBC驱动程序也是桥接模式的应用之一。使用JDBC驱动程序的应用系统就是抽象角色,而所使用的数据库是实现角色。一个JDBC驱动程序可以动态的将一个特定类型的数据库与一个Java应用程序绑定在一起。从而实现抽象角色与实现角色的动态耦合。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。