桥接模式基本介绍:
- 桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。
- 是一种结构型设计模式
- Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
现对不同品牌的不同产品,用编程的方法实现,传统的方法的实现如下图:
在这类型变成代码里,由于分组的原因,每次新增产品或者新增品牌的时候需要修改已存在的类,扩展性极差,耦合性强,可维护性差,因此我们用桥接模式来实现这个需求:
UML类图如下:
定义的接口Brand是品牌的抽象,由子类具体品牌类实现,抽象类AbstractProduct是对产品的抽象,由具体产品类实现。
定义一个接口,命名为品牌Brand,有一个方法brand()负责使用并显示品牌名:
public interface Brand {
public void brand();
}
具体品牌类Nike实现:
public class Nike implements Brand {
@Override
public void brand() {
System.out.print("耐克品牌");
}
}
具体品牌类Adidas实现:
public class Adidas implements Brand {
@Override
public void brand() {
System.out.print("阿迪达斯品牌");
}
}
抽象产品类(聚合了品牌接口,由其子类具体实现产品):
public abstract class AbstractProduct {
//作为其私有属性
Brand brand = null;
//通过构造器传参
public AbstractProduct(Brand brand) {
this.brand = brand;
}
protected abstract void makeProduct();
}
子类Clothing具体实现产品类:
public class Clothing extends AbstractProduct {
//构造器调用父类构造器并且使用传入接口的具体实现对象调用品牌名
public Clothing(Brand brand) {
super(brand);
brand.brand();
}
//生产具体产品
@Override
public void makeProduct() {
System.out.println("—>制造衣服");
}
}
子类Shoes具体实现产品类:
public class Shoes extends AbstractProduct {
//构造器调用父类构造器并且使用传入接口的具体实现对象调用品牌名
public Shoes(Brand brand) {
super(brand);
brand.brand();
}
//生产具体产品
@Override
public void makeProduct() {
System.out.println("—>制造鞋子");
}
}
客户端使用类:
public class Client {
public static void main(String[] args) {
Clothing clothing = new Clothing(new Adidas());
clothing.makeProduct();
Shoes shoes = new Shoes(new Nike());
shoes.makeProduct();
}
}
客户端在新建对象是传入品牌类的对象为参,返回了一个具体的产品类的对象,通过具体产品类的对象调用makeProduct()函数达到效果。
结果如下:
阿迪达斯品牌—>制造衣服
耐克品牌—>制造鞋子
通过桥接模式,我们达到了解耦的目的,无论后面增加多少种品牌或者具体实现的产品,都不会影响原来基础上已经存在的东西,因此,程序具有较好的扩展性。
总结
- 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统;
- 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成;
- 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本;
- 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程;
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。