桥接模式用于将有多个维度变化的产品中的变化维度抽取出来单独处理,用GOF的定义是:将抽象部分与实现部分分离,使它们都可以独立的变化。
桥接模式概述
桥接模式的基本定义里面包括了四种角色(假设产品只具有2个维度的变化Fa和Fb):
1. 抽象产品类角色Abstraction,该类是产品的基类,它直接负责产品的架构定义和接口定义并定义维度变化方法Fa,它内部包含了一个接口类Implementor
2. 变化维度实现接口类Implementor,该接口是抽取的A中某种需要经常变化的维度或者说方法而产生的,它定义了变化的维度所需要实现的方法Fb
3. 具体产品类角色RefinedAbstraction,该类继承Abstraction,实现具体的产品构建Fa
4. 变化维度实现类ConcreteImplementor,该类实现接口Implementor,具体实现维度变化方法Fb
模式设计图如下
说白话点,其实就是在A和IB中各实现一个维度变化的方法,产品本身实现一个维度的变化,而将另外一个维度的变化抽象出一个接口,然后将该接口实现包含在产品类中来实现产品2个维度的解耦。
桥接模式的伪代码实现
以画图为例,画的图可能是圆形或者矩形,圆形和矩形的内部结构是不同的(举例为缩放resize),而且他们的绘制方法也是不同的(draw),因此就存在2个维度的变化(resize和draw),我们抽象圆形和矩形都是形状,绘制方法抽象为draw。
interface drawsth { void drawme(); } public class drawsth1 implements drawsth { public void drawme() { //do draw } } public class drawsth2 implements drawsth { public void drawme() { // do draw } } abstract class shape { public void draw(); publlic void resize(); } class rect extends shape { private drawsth _innerdraw; public rect(drawsth dd) { _innerdraw = dd; } public void draw() { _innerdraw.drawme(); } public void resize() { // do resize things } } class circle extends shape { private drawsth _innerdraw; public circle(drawsth dd) { _innerdraw = dd; } public void draw() { _innerdraw.drawme(); } public void resize() { // do resize things } } class mybridge { public static void main(String[] args) { shape mshape1 = new rect(new drawsth1()); shape mshape2 = new circle(new drawsth2()); mshape1.draw(); mshape1.resize(); mshape2.draw(); mshape2.resize(); } }