设计模式(结构型设计模式------桥接模式)
桥接模式
基本定义
桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。
降低了类与类之间的耦合度:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。
模式结构
Abstraction:抽象类(最终需要的对象的类)。
RefinedAbstraction:扩充抽象类(产品/对象)。
Implementor:实现类接口(服务于我们的抽象类,作为抽象类的一个属性或者是维度)。
ConcreteImplementor:具体实现类 。
代码实现
Implementor:实现类接口
实现类接口,用于服务于抽象类(Car), 为抽象类提供必要的属性或维度
java
public interface Color {
void addColor(String carType);
}
ConcreteImplementor: 具体实现类
java
@Slf4j
public class Black implements Color{
public void addColor(String carType) {
log.info("汽车类型:{}, 喷漆颜色:黑色", carType);
}
}
java
@Slf4j
public class White implements Color {
public void addColor(String carType) {
log.info("汽车类型:{}, 喷漆颜色:白色", carType);
}
}
Abstraction: 抽象类
桥接模式最终目的就是为了建立一个抽象类的对象
java
public abstract class Car {
/**
* 关联关系,抽象类使用接口实现类通过关联关系进行的,这也是桥接模式的一个重要的特点
* 关联关系的重要性:
* 1.关联关系是弱关联(降低耦合度),例如需要增加汽车颜色,只需实现color接口即可,不影响现有代码
* 2.使用color属性时, 没有通过继承或者实现方式,这是桥接模式特点之一
* 相比于适配器模式,关联关系的桥接模式更容易达到抽象对象结构建立的目的,而适配器模式通过继承和实现的方式,达到接口兼容的目的
*/
public Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void makeCar(String carType);
}
RefinedAbstraction: 扩充抽象类
扩充抽象类,遵从面向接口编程
java
public class CarImpl extends Car {
public void makeCar(String carType) {
color.addColor(carType);
}
}
测试类
java
public class Test {
public static void main(String[] args){
Car car = new CarImpl();
Color color = new Black();
car.setColor(color);
car.makeCar("AUDI");//print: 汽车类型:AUDI, 喷漆颜色:黑色
}
}
优点
分离抽象接口及其实现部分。提高了比继承更好的解决方案。
桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
实现细节对客户透明,可以对用户隐藏实现细节。
缺点
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。
使用场景
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
总结
桥接模式实现了抽象化与实现化的脱耦。他们两个互相独立,不会影响到对方。
对于两个独立变化的维度,使用桥接模式再适合不过了。
"具体的抽象类"(我们将抽象类的属性交给具体的实现类去处理)所做的改变,是不会影响到客户的。