定义:抽象和接口脱耦,实现层和抽象层N-N关系
4个角色:一个抽象类、多个抽象子类、一个接口类、多个接口实现类
关系:抽象和接口是聚合关系,抽象类多态调用接口类的方法
具体实现:一个接口定义多个方法,多个接口实现类实现接口的方法,一个抽象类聚合接口,添加方法每个方法都组合方式调用接口方法,抽象的子类构造方法super(接口对象),"这里初始化抽象的接口属性,聚合和组合都可以",完成初始化抽象父类,完了之后,抽象子类就可以使用接口的方法了,聚合使用:抽象类对象 = new 抽象子类(接口实现类),组合使用:抽象类对象 = new 抽象子类(),抽象类对象.setter(接口实现类);然后抽象类对象就可以调用实现类的各种方法。
我的理解,有点像对象和对象间的N-N关系的中间桥接的作用,容易扩展,不会出现类爆炸;
例子:JDBC的DriverManger
demo理解:
炒粉老板的菜单:
口味:不辣、微辣、中辣
食材:河粉、米粉
如果枚举出所有口味和食材搭配的菜单列表,则菜单列表会很长很冗余,不辣的河粉、微辣的河粉、中辣的河粉、不辣的米粉、微辣的米粉、中辣的米粉;
使用桥接模式,则可以解决该问题,两个类独立变化,灵活扩展,减少它们之间的耦合。比如老板的菜单口味增加了特辣,食材增加了拉面,则仅需口味和食材各自扩展即可,互相不影响,避免出现菜单冗余;
UML类图:
![](https://i-blog.csdnimg.cn/blog_migrate/ba3ea048616ca6ac437f14afdc59b280.png)
代码实现:
package com.xiaomu.arithmetic.design.bridge;
/**
* 接口-口味
*/
interface Taste {
void print(String type);
}
/**
* 具体实现-不辣
*/
class NoHot implements Taste {
@Override
public void print(String type) {
System.out.println("不辣的" + type);
}
}
/**
* 具体实现-微辣
*/
class MildHot implements Taste {
@Override
public void print(String type) {
System.out.println("微辣的" + type);
}
}
/**
* 具体实现-中辣
*/
class MediumHot implements Taste {
@Override
public void print(String type) {
System.out.println("中辣的" + type);
}
}
/**
* 抽象-食材
*/
abstract class Food {
Taste taste;
public Food(Taste taste) {
this.taste = taste;
}
public abstract void cooking();
}
/**
* 抽象子类-河粉
*/
class Food1 extends Food {
public Food1(Taste taste) {
super(taste);
}
@Override
public void cooking() {
taste.print("河粉");
}
}
/**
* 抽象子类-米粉
*/
class Food2 extends Food {
public Food2(Taste taste) {
super(taste);
}
@Override
public void cooking() {
taste.print("米粉");
}
}
public class BridgeModel {
public static void main(String[] args) {
Food food1 = new Food1(new MildHot());
Food food2 = new Food2(new MediumHot());
food1.cooking();
food2.cooking();
}
}