桥接模式是一种对象结构型模式,使用了一种比较巧妙的方法去处理多层继承存在的问题,用抽象关系取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效地控制了系统中类的个数。
桥接模式结构
1.**Abstraction(抽象类):**它是用于定义抽象类的接口,一般情况下是抽象类比较多
2.**RefinedAbstraction(扩充抽象类):**他是实现了Abstraction的抽象类
3.**Implementor(实现类接口):**它是定义了实现类的接口,Implementor可以和Abstraction完全不同,但是Abstraction中需要内聚Implementor对象
4.**ConcreteImplementor(具体实现类):**它是Implementor的实现类
案例:
某软件公司要开发一个跨平台图像浏览系统,要求该系统能够显示BMP,JPG,GIF,PNG等多种格式的文件,并且能够在Windows,
Linux,UNIX等多个操作系统上运行。系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将图像绘制出来
这个需求如果用传统的方式来写的话,需要写一个Windows的BMP,Windows的JPG类,等等等等,类会暴增,
package com.designpatten.bridge.demo1;
/**
* 图像类型的接口,会有很多不同类型的图像去实现这个抽象类
* 在桥接模式里面,准备要被聚合的那个抽象类,要定义成接口,然后另一个就定义成抽象类
*/
public interface Image {
public void doPrint(Matrix matrix);
}
/**
这个是矩阵类,将图像显示出来需要一个矩阵,这个代码就不写了
**/
package com.designpatten.bridge.demo1;
public class Matrix {
}
image的实现类
package com.designpatten.bridge.demo1;
public class GIFImage implements Image {
@Override
public void doPrint(Matrix matrix) {
System.out.println("GIF的格式显示图像");
}
}
package com.designpatten.bridge.demo1;
public class JPGImage implements Image {
@Override
public void doPrint(Matrix matrix) {
System.out.println("jpg的格式显示图像");
}
}
package com.designpatten.bridge.demo1;
public class PNGImage implements Image {
@Override
public void doPrint(Matrix matrix) {
System.out.println("PNG的格式打印图象");
}
}
abstract角色,里面需要内聚image对象
package com.designpatten.bridge.demo1;
public abstract class OperationSystem {
protected Image image;
public void setImage(Image image){
this.image = image;
}
public abstract void parseImage(String imageName);
}
package com.designpatten.bridge.demo1;
public class Linux extends OperationSystem {
@Override
public void parseImage(String imageName) {
System.out.println("在linux中打印图像:"+imageName);
image.doPrint(new Matrix());
}
}
package com.designpatten.bridge.demo1;
public class Windows extends OperationSystem {
@Override
public void parseImage(String imageName) {
System.out.println("在Windows中打印图像:"+imageName);
image.doPrint(new Matrix());
}
}
客户端代码
package com.designpatten.bridge.demo1;
public class Client {
public static void main(String[] args) {
Windows windows = new Windows();
windows.setImage(new JPGImage());
windows.parseImage("我是一张图片");
}
}
运行结果
使用这种方式去创建类,如果说我想再加一个UNIX操作系统的类,里面可以显示各种图片,我只需要创建一个UNIX的类并且继承SystemOperation类就可以了,满足开闭原则,也不会出现类爆炸的情况
桥接模式的优点
1.分离抽象接口及其实现部分。
2.在很多情况下,桥接模式可以取代多层继承方案,因为多层继承方案违背了单一职责原则,复用性比较差,会让类的数量变的非常多
3.桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度都不需要修改原有系统,符合开闭原则
桥接模式的缺点
1.桥接模式会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程
2.桥接模式要求正确地识别出系统中的两个独立变化的维度,因此其使用范围具有一定的局限性
桥接模式的适用环境
当一个类存在多个变化的维度的时候就比较适合使用桥接模式