说明:本文介绍结构型设计模式之一的桥接模式
定义
桥接模式(Bridge Pattern)又叫作桥梁模式、接口(Interface)模式或柄体(Handle and Body)模式,指将抽象部分与具体实现部分分离,使它们都可以独立地变化,属于结构型设计模式。(引自《设计模式就该这样学》P263)
画笔
以画笔画画为例,如下,,是一个画笔抽象类
(抽象画笔类,Pen)
/**
 * 抽象画笔
 */
public abstract class Pen {
    /**
     * 获取颜色
     */
    public abstract void getColor();
    /**
     * 绘制图形
     */
    public void draw() {
        getColor();
        System.out.print("▲");
    }
}
 
(黑色画笔,BlackPen,使用继承实现方法)
/**
 * 黑色画笔
 */
public class BlackPen extends Pen {
    @Override
    public void getColor() {
        System.out.print("黑色");
    }
}
 
绘制
public class Client {
    public static void main(String[] args) {
        new BlackPen().draw();
    }
}
 
如下:

画笔与尺子
上面的例子,针对绘制只有单个维度(颜色)的改变,是用继承(extends)实现其抽象方法的,如果是多维度的,例如加上尺子,绘制图案需要使用尺子和颜色。
如下,
(尺子接口,Ruler)
/**
 * 尺子接口
 */
public interface Ruler {
    /**
     * 使用尺子规范绘制
     */
    void regularize();
}
 
(正方形尺子,SquareRuler)
/**
 * 正方形
 */
public class SquareRuler implements Ruler {
    @Override
    public void regularize() {
        System.out.println("□");
    }
}
 
(三角形尺子,TriangleRuler)
/**
 * 三角形
 */
public class TriangleRuler implements Ruler {
    @Override
    public void regularize() {
        System.out.println("▲");
    }
}
 
(圆形尺子,CircleRuler)
/**
 * 圆形
 */
public class CircleRuler implements Ruler {
    @Override
    public void regularize() {
        System.out.println("◯");
    }
}
 
(抽象画笔,Pen,实例化一个尺子对象)
/**
 * 抽象画笔
 */
public abstract class Pen {
    protected Ruler ruler;
    /**
     * 构造器注入
     */
    public Pen(Ruler ruler) {
        this.ruler = ruler;
    }
    /**
     * 绘制图形
     */
    public abstract void draw();
}
 
(黑色画笔,BlackPen)
/**
 * 黑色画笔
 */
public class BlackPen extends Pen {
    /**
     * 构造器注入
     */
    public BlackPen(Ruler ruler) {
        super(ruler);
    }
    @Override
    public void draw() {
        System.out.print("黑");
        ruler.regularize();
    }
}
 
(白色画笔,WhitePen)
/**
 * 白色画笔
 */
public class WhitePen extends Pen {
    /**
     * 构造器注入
     */
    public WhitePen(Ruler ruler) {
        super(ruler);
    }
    @Override
    public void draw() {
        System.out.print("白");
        ruler.regularize();
    }
}
 
绘制白色正方形,黑色圆形
public class Client {
    public static void main(String[] args) {
        new WhitePen(new SquareRuler()).draw();
        new BlackPen(new CircleRuler()).draw();
    }
}
 

可见使用桥接模式,可以连接两个维度的对象,避免了多维度对象之间的继承。
想想看,如果不使用以上设计,去掉画笔抽象类(Pen),而直接用黑色画笔、白色画笔去继承正方形尺子、三角形尺子、圆形尺子完成绘制也是可以的。如果这样,三个尺子,两种颜色画笔,会有六个类,如果是七个尺子,十种颜色的画笔,就会有7 × 10,70个类,类会非常多,不利于管理,这是一个问题。另外,使用继承违反了设计模式的合成复用原则(Composite Reuse Principle,CRP,尽量使用对象组合,而不是继承来达到复用的目的)。
关于设计模式的原则,参考下面这篇文章:
- 【设计模式-1】UML和设计原则
 
使用场景
在《设计模式就该这样学》(P264)这本书中,提到状态模式适用于以下场景:
(1)在抽象和具体实现之间需要增加更多灵活性的场景。
(2)一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。
如上述画笔颜色和尺子,需要独立扩展,如果用继承把画笔和尺子绑定死,还怎么独立扩展?
(3)不希望使用继承,或因为多层继承导致系统类的个数剧增。
总结
本文介绍了结构型设计模式中的桥接模式,参考《设计模式就该这样学》、《秒懂设计模式》两本书,其中的例子来自《秒懂设计模式》。














![[ Qt ] | QPushButton常见用法](https://i-blog.csdnimg.cn/direct/334f8a5a97c54445aae4804912a67fcf.png)




