结构型模式关注如何将现有类或对象组织一起形成更加强大的结构。
一、概述
桥接模式(Bridge Pattern):将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
桥接模式又称柄体(Handle and Body)模式 或 接口(Interface)模式。它用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代多层继承。
二、结构
- Abstraction(抽象类):
定义抽象类的接口,通常为抽象类,其中定义 Implementor(实现类接口)类型的对象并可维护该对象,他们具有关联关系。 - RefinedAbstraction(扩充抽象类):
扩充 Abstraction 的定义,通常它是具体类,实现抽象业务方法。 - Implementor(实现类接口):
定义实现类的接口,不一定与 Abstraction 一致,它们可以完全不同,通过关联关系代替继承关系。 - ConcreteImplementor(具体实现类):
Implementor 的具体实现,不同实现类提供不同的实现。
三、举例
某公司开发跨平台图片浏览系统,能够显示BMP、JPG、GIF、PNG等多种 格式的文件,现使用桥接模式,对系统做抽象概述。
系统类图:
Matrix 像素矩阵类:辅助类
public class Matrix {
}
ImageImpl 抽象平台类:充当实现类接口
public interface ImageImpl {
public void doPaint(Matrix matrix);
}
PlatformAImpl 平台A类:充当具体实现类
public class PlatformAImpl implements ImageImpl {
@Override
public void doPaint(Matrix matrix) {
System.out.println("在 平台A 显示图像:");
}
}
PlatformBImpl 平台B类:充当具体实现类
public class PlatformBImpl implements ImageImpl {
@Override
public void doPaint(Matrix matrix) {
System.out.println("在 平台B 显示图像:");
}
}
PlatformCImpl 平台C类:充当具体实现类
public class PlatformCImpl implements ImageImpl {
@Override
public void doPaint(Matrix matrix) {
System.out.println("在 平台C 显示图像:");
}
}
Image 图像类:充当抽象类
public abstract class Image {
protected ImageImpl imp;
public void setImageImp(ImageImpl imp){
this.imp = imp;
}
public abstract void parseFile(String fileName);
}
JPGImage JPG图像类:充当扩充抽象类
public class JPGImage extends Image{
@Override
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为 JPG");
}
}
PNGImage PNG图像类:充当扩充抽象类
public class PNGImage extends Image{
@Override
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为 PNG");
}
}
BMPImage BMP图像类:充当扩充抽象类
public class BMPImage extends Image{
@Override
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为 BMP");
}
}
GIFImage GIF图像类:充当扩充抽象类
public class GIFImage extends Image{
@Override
public void parseFile(String fileName) {
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为 GIF");
}
}
四、特点
? 优点
- 分离抽象接口、实现部分
- 可以取代多层继承方案
- 提高系统可扩展性
? 缺点
- 增加系统理解、设计难度
- 需要靠经验正确识别两个独立的维度
|