定义:
将抽象部分与它的实现部分分离,使它们都可以独立地变化。他是一种对象结构型模式。
优点:
分离抽象接口及其实现部分
可以取代多层继承方案,极大地减少了子类的个数
提高了系统的可扩展性,在两个变化维度中任意扩展一个维度, 不需要修改原有系统,符合开闭原则
缺点:
会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就要针对抽象层进行设计与编程
正确识别出系统中两个独立变化的维度并不是一件容易的事情
适用范围:
需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
抽象部分和实现部分可以以继承的方式独立扩展而互不影响
一个类存在两个(或多个)独立变化的维度,且这两个(或多个) 维度都需要独立地进行扩展
不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统
实例:
现需要提供大中小3种型号的画笔,能够绘制5种不同颜色,如果使用蜡笔,我们需要准备3*5=15支蜡笔,也就是说必须准备15个具体的蜡笔类。而如果使用毛笔的话,只需要3种型号 的毛笔,外加5个颜料盒,用3+5=8个类就可以实现15支蜡笔 的功能。本实例使用桥接模式来模拟毛笔的使用过程。
实例uml:
实例目录:
实例代码:
Color.java
package bridge;
public interface Color {
void bepaint(String penType,String name);
}
Blue.java
package bridge;
public class Blue implements Color{
@Override
public void bepaint(String penType, String name) {
System.out.println(penType+"蓝色的"+name+".");
}
}
Red.java
package bridge;
public class Red implements Color {
@Override
public void bepaint(String penType, String name) {
System.out.println(penType+"红色的"+name+".");
}
}
Green.java
package bridge;
public class Green implements Color {
@Override
public void bepaint(String penType, String name) {
System.out.println(penType+"绿色的"+name+".");
}
}
White.java
package bridge;
public class White implements Color {
@Override
public void bepaint(String penType, String name) {
System.out.println(penType+"白色的"+name+".");
}
}
Black.java
package bridge;
public class Black implements Color {
@Override
public void bepaint(String penType, String name) {
System.out.println(penType+"黑色的"+name+".");
}
}
Pen.java
package bridge;
public abstract class Pen {
protected Color color;
public void setColor(Color color){
this.color=color;
}
public abstract void draw(String name);
}
BigPen.java
package bridge;
public class BigPen extends Pen{
public void draw(String name){
String penType="大号毛笔绘制";
this.color.bepaint(penType,name);
}
}
MiddlePen.java
package bridge;
public class MiddlePen extends Pen{
public void draw(String name){
String penType="中号毛笔绘制";
this.color.bepaint(penType,name);
}
}
SmallPen.java
package bridge;
public class SmallPen extends Pen{
public void draw(String name){
String penType="小号毛笔绘制";
this.color.bepaint(penType,name);
}
}
XMLUtil.java
package bridge;
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 XMLUtil {
public static Object getBean(String args) {
try {
//创建文档对象
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder =dFactory.newDocumentBuilder();
Document doc;
doc=builder.parse(new File("bridge.xml"));
//获取文本节点
NodeList nl=doc.getElementsByTagName("className");Node classNode=null;String cName=null;
// Node classNode=nl.item(0).getFirstChild();
//String cName=classNode.getNodeValue();
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;
}
}
}
bridge.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<className>bridge.Red</className>
<className>bridge.BigPen</className>
</config>
运行结果截图: