桥接模式(Bridge Pattern)
核心:处理多层继承结构,处理多维度变化的场景,将各个维度设计成独立的继承结构,使各个维度可以独立的扩展在抽象层建立关联。
总结:
桥接模式可以取代多层继承的方案。多层继承违背了单一指责原则,复用性较差,类的个数也非常多。桥接模式可以极大的减少子类的数量,从而降低管理和维护的成本。
桥接模式极大的提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。
就像一座桥,将两个变化维度连接起来,各个维度都可以独立的变化,故称之为:桥模式。
classic
/**
* @author Satsuki
* @time 2019/8/13 17:42
* @description:在实现Implementor接口的子类中实现了在该接口中声明的方法,
* 用于定义与该维度相对应的一些具体方法。
*/
public interface Implementor {
public void operationImpl();
}
public class ConcreteImplementor implements Implementor {
@Override
public void operationImpl() {
//具体业务方法的实现
}
}
/**
* @author Satsuki
* @time 2019/8/13 17:43
* @description:对于另一“抽象部分”维度而言,其典型的抽象类代码如下所示:
*/
public abstract class Abstraction {
//定义实现类的抽象接口给
protected Implementor impl;
public Abstraction(Implementor impl) {
this.impl = impl;
}
public abstract void operation();
}
/**
* @author Satsuki
* @time 2019/8/13 17:45
* @description:
* 在抽象类Abstraction中定义了一个实现类接口类型的成员对象impl,
* 再通过注入的方式给该对象赋值,一般将该对象的可见性定义为protected,
* 以便在其子类中访问Implementor的方法,
* 其子类一般称为扩充抽象类或细化抽象类(RefinedAbstraction),
* 典型的RefinedAbstraction类代码如下所示:
*/
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(Implementor impl) {
super(impl);
}
@Override
public void operation() {
//业务代码
//调用实现类的方法
impl.operationImpl();
//业务代码
}
}
example
/**
* @author Satsuki
* @time 2019/8/13 17:52
* @description:
* 抽象操作系统实现类:实现类接口
*/
public interface ImageImp {
//显示像素矩阵m
public void doPaint(Matrix m);
}
/**
* @author Satsuki
* @time 2019/8/13 17:54
* @description:
* Windows操作系统实现类:具体实现类
*/
public class WindowImp implements ImageImp {
@Override
public void doPaint(Matrix m) {
//调用Windows系统的绘制函数绘制像素矩阵
System.out.println("在windows操作系统中显示图像");
}
}
/**
* @author Satsuki
* @time 2019/8/13 17:55
* @description:
* //Unix操作系统实现类:具体实现类
*/
public class UnixImp implements ImageImp {
public void doPaint(Matrix m) {
//调用Unix系统的绘制函数绘制像素矩阵
System.out.print("在Unix操作系统中显示图像:");
}
}
/**
* @author Satsuki
* @time 2019/8/13 17:54
* @description:
* Linux操作系统实现类:具体实现类
*/
public class LinuxImp implements ImageImp {
@Override
public void doPaint(Matrix m) {
//调用Linux系统的绘制函数绘制像素矩阵
System.out.print("在Linux操作系统中显示图像:");
}
}
/**
* @author Satsuki
* @time 2019/8/13 17:51
* @description:
* 抽象图像类:抽象类
*/
public abstract class Image {
protected ImageImp imageImp;
public void setImageImp(ImageImp imageImp) {
this.imageImp = imageImp;
}
public abstract void parseFile(String fileName);
}
/**
* @author Satsuki
* @time 2019/8/13 17:58
* @description:
* BMP格式图像:扩充抽象类
*/
public class BMPImage extends Image {
public void parseFile(String fileName) {
//模拟解析BMP文件并获得一个像素矩阵对象m;
Matrix m = new Matrix();
imageImp.doPaint(m);
System.out.println(fileName + ",格式为BMP。");
}
}
/**
* @author Satsuki
* @time 2019/8/13 17:58
* @description:
* GIF格式图像:扩充抽象类
*/
public class GIFImage extends Image {
public void parseFile(String fileName) {
//模拟解析GIF文件并获得一个像素矩阵对象m;
Matrix m = new Matrix();
imageImp.doPaint(m);
System.out.println(fileName + ",格式为GIF。");
}
}
/**
* @author Satsuki
* @time 2019/8/13 17:56
* @description:
* JPG格式图像:扩充抽象类
*/
public class JPGImage extends Image {
@Override
public void setImageImp(ImageImp imageImp) {
super.setImageImp(imageImp);
}
@Override
public void parseFile(String fileName) {
//模拟解析JPG文件并获得一个像素矩阵对象m
Matrix m = new Matrix();
imageImp.doPaint(m);
System.out.println(fileName+ ",格式为jpg");
}
}
/**
* @author Satsuki
* @time 2019/8/13 17:57
* @description:/
* NG格式图像:扩充抽象类
*/
public class PNGImage extends Image {
public void parseFile(String fileName) {
//模拟解析PNG文件并获得一个像素矩阵对象m;
Matrix m = new Matrix();
imageImp.doPaint(m);
System.out.println(fileName + ",格式为PNG。");
}
}
/**
* @author Satsuki
* @time 2019/8/13 17:59
* @description:
*/
public class Client {
public static void main(String[] args) {
Image image = new JPGImage();
ImageImp imageImp = new WindowImp();
image.setImageImp(imageImp);
image.parseFile("satsuki");
}
}