概念
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。
参考连接: https://www.runoob.com/design-pattern/bridge-pattern.html
代码案例
公共类
/** * 枚举类 */ 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】