什么是桥接模式
桥接模式是讲抽象部分与它的实现部分分离,使他们都可以独立地进行变化。
- 需要注意的是这里说的抽象与实现分离,并非类似抽象类与其派生类分离。实现部分指的是抽象类和他的派生类用来实现自己的对象。
说通俗点,就是实现系统可能有多角度分类,每一种分类都有变化的可能,那么把这种多角度分离出来让他们独立变化,减少他们之间的耦合,便是桥接模式的使用。
原理图
为什么要用桥接模式
试想市面上的手表:
- 按功能分,可以分为普通手表、智能手表等
- 按外形分,可以分为圆形手表、方形手表等
现在,想要选一只手表,总共有多少选择?
答案很明显,是4种,分别是圆形普通手表、方形普通手表、圆形智能手表、方形智能手表。
这四种手表的关系如下图:
但是这样很明显就有一个问题:
- 市面上多出一种功能的手表怎么办?比如户外手表
- 市面上多出一种外形的手表怎么办?比如长方形的手表
如果要做增加,将直接增加类的数量,且增加一点,对整个项目的结构就会有很大影响,是明显违背开闭原则的,同时也会面临“类爆炸”的问题。
那该如何避免上述问题呢?
使用桥接模式:
我们重新看一下问题描述,我们已经有了两种划分方式:按功能分、按外形分。
是啊,有两种划分方法,但是怎么共同表示一个产品呢?
当然是把两种方式连接起来啊,那不就有了一个共同描述的产品了吗(要充分运用合成复用原则,使用组合的方式,降低两个类的耦合程度):
怎么理解这里用了桥接模式?
现在想要一个圆形普通手表,那么需要的是普通手表和圆形两个类,这两个类需要联合使用,那么他们是怎么联合起来的:通过手表和形状两个类进行链接,这两类可以想象成一座桥,这座桥将两个类连接起来,故称为“桥接模式”。
用代码实现一下吧:
手表类:
public abstract class Watch {
private Shape shape;
Watch(Shape shape){
this.shape = shape;
}
public abstract void printType();
public void printWatchModel(){
shape.printShape();
printType();
}
}
形状类:
public abstract class Shape {
public abstract void printShape();
}
普通手表:
public class Common extends Watch {
Common(Shape shape) {
super(shape);
}
@Override
public void printType() {
System.out.println("普通手表");
}
}
智能手表:
public class Smart extends Watch {
Smart(Shape shape) {
super(shape);
}
@Override
public void printType() {
System.out.println("智能手表");
}
}
圆形类:
public class Circle extends Shape {
@Override
public void printShape() {
System.out.println("圆形");
}
}
方形类:
public class Square extends Shape {
@Override
public void printShape() {
System.out.println("方形");
}
}
做出选择的用户:
public class User {
public static void main(String[] args) {
Watch watch = new Smart(new Circle());
watch.printWatchModel();
}
}