概念
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。
参考连接: 桥接模式 | 菜鸟教程
代码案例
公共类
/**
* 枚举类
*/
public enum StuEnum {
//车子枚举
CAR("CAR", "汽车"),
BICYCLE("BICYCLE", "自行车"),
TRAIN("TRAIN", "火车");
private final String key;
private final String value;
StuEnum(String key, String value) {
this.key = key;
this.value = value;
}
/**
* 获取key
*
* @return
*/
public String getKey() {
return key;
}
/**
* 获取value
*
* @return
*/
public String getValue() {
return value;
}
}
创建生产接口
/**
* 生产接口
*/
public interface ProductionAPI {
/**
* 生产车子
* @return
*/
public String product();
}
创建三个生产接口实现类
汽车
/**
* 生产汽车
*/
@Service("car")
@Slf4j
public class Car implements ProductionAPI {
@Override
public String product() {
return StuEnum.CAR.getValue();
}
}
火车
/**
* 生产火车
*/
@Service("train")
@Slf4j
public class Train implements ProductionAPI {
@Override
public String product() {
return StuEnum.TRAIN.getValue();
}
}
自行车
/**
* 生产自行车
*/
@Service("bicycle")
@Slf4j
public class Bicycle implements ProductionAPI {
@Override
public String product() {
return StuEnum.BICYCLE.getValue();
}
}
车子抽象类-用于生产不同的车子
/**
* 车子生产抽象类
*/
public abstract class Cars {
protected ProductionAPI productionAPI;
protected Cars(ProductionAPI productionAPI) {
this.productionAPI = productionAPI;
}
public abstract String product();
}
上色实现类-用于给生产的车子上色
/**
* 上色实现类实现制造实现类
*/
@Slf4j
public class Colour extends Cars{
private String colour;
/**
* 上色
* @param productionAPI
* @param colour
*/
public Colour(ProductionAPI productionAPI, String colour) {
super(productionAPI);
this.colour = colour;
}
/**
* 制造
* @return
*/
@Override
public String product() {
String product="生产======"+colour+"=================="+productionAPI.product();
log.info(product);
return product;
}
}
测试主类
/**
* 设计模式控制器
*/
@RestController
@RequestMapping("/designPattern")
@Slf4j
public class DesignController {
@Autowired
private ApplicationContext applicationContext;
@GetMapping("/bridge")
public ResponseModel bridge(String carType, String colour) {
ProductionAPI api = null;
if (StFlag.CAR.equalsIgnoreCase(carType)) {
api = applicationContext.getBean(carType.toLowerCase(), Car.class);
} else if (StFlag.TRAIN.equalsIgnoreCase(carType)) {
api = applicationContext.getBean(carType.toLowerCase(), Train.class);
} else if (StFlag.BICYCLE.equalsIgnoreCase(carType)) {
api = applicationContext.getBean(carType.toLowerCase(), Bicycle.class);
}
Colour colourNew = new Colour(api, colour);
String product = colourNew.product();
return new ResponseModel("桥接模式完成", 200, product);
}
}
测试案例
桥接模式-白色火车
桥接模式-黑色自行车
桥接模式-红色汽车
carType=Train&colour=白色
2022-06-20 01:39:54.165 INFO 生产======白色==================火车 【http-nio-8081-exec-1】【Colour:30】
carType=bicycle&colour=黑色
2022-06-20 01:40:01.608 INFO 生产======黑色==================自行车 【http-nio-8081-exec-10】【Colour:30】
carType=car&colour=红色
2022-06-20 01:40:04.988 INFO 生产======红色==================汽车 【http-nio-8081-exec-9】【Colour:30】