少壮不努力,老大徒伤悲。
一、桥接模式简介
桥接模式是设计模式中结构型模式的一种。桥接的作用是把抽象化和实例化解耦,使二者可以独立变化。桥接模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。使得实体类和实现类可以被结构化的改变而不互相影响。
桥接模式最适合用来解决由多种变化维度导致的继承类爆炸式增长的问题。
二、适用场景举例
场景如下:
家具有很多种,例如桌子、椅子等,每种家具根据不同的材料又可以有不同的分类。如果用继承的方式设计,那么设计如下:
如果要增加一种材料,那么需要修改如下:
如果要再增加一种家具,需要修改如下:
从以上设计可以看出,每变化一种维度,类的数量就呈现爆炸式的增长。这种实现方式显然不是我们想要的方式。
遇到这种具有多种变化维度的系统,就可以使用桥接模式来设计。
三、桥接模式的解决方案
对于以上场景,可以把家具的种类抽象出一个抽象类,把材料抽象出一个接口,然后设计类图如下:
这样设计之后无论使增加家具的类型还是增加材料的类型都不会影响到另一个维度的变化,从而解决继承方式导致的类爆炸问题。
四、代码演示桥接模式
Material(材料接口)
/**
* 材料接口
*
* @author ZhengNC
* @date 2020/9/1 9:55
*/
public interface Material {
/**
* 获取材料
*
* @return
*/
String getMaterial();
}
Wood(木头)
/**
* 木头
*
* @author ZhengNC
* @date 2020/9/1 9:59
*/
public class Wood implements Material {
@Override
public String getMaterial() {
return "木";
}
}
Iron(铁)
/**
* 铁
*
* @author ZhengNC
* @date 2020/9/1 10:04
*/
public class Iron implements Material {
@Override
public String getMaterial() {
return "铁";
}
}
Furniture(抽象家具)
/**
* 抽象家具
*
* @author ZhengNC
* @date 2020/9/1 9:57
*/
public abstract class Furniture {
protected Material material;
public Furniture(Material material){
this.material = material;
}
/**
* 打印家具的名字
*/
public abstract void printName();
}
Table(桌子)
/**
* 桌子
*
* @author ZhengNC
* @date 2020/9/1 10:04
*/
public class Table extends Furniture {
public Table(Material material) {
super(material);
}
@Override
public void printName() {
System.out.println(material.getMaterial() + "桌子");
}
}
Chair(椅子)
/**
* 椅子
*
* @author ZhengNC
* @date 2020/9/1 10:07
*/
public class Chair extends Furniture {
public Chair(Material material) {
super(material);
}
@Override
public void printName() {
System.out.println(material.getMaterial() + "椅子");
}
}
Bed(床)
/**
* 床
*
* @author ZhengNC
* @date 2020/9/1 10:08
*/
public class Bed extends Furniture {
public Bed(Material material) {
super(material);
}
@Override
public void printName() {
System.out.println(material.getMaterial() + "床");
}
}
五、测试桥接模式代码
/**
* 测试桥接模式
*
* @author ZhengNC
* @date 2020/9/1 10:09
*/
public class TestBridge {
public static void main(String[] args) {
//新建木桌子
Furniture table = new Table(new Wood());
table.printName();
//新建铁椅子
Furniture chair = new Chair(new Iron());
chair.printName();
//新建木床
Furniture bed = new Bed(new Wood());
bed.printName();
}
}
输出结果:
木桌子
铁椅子
木床