代码改变世界

徒手撸设计模式-桥接模式

2022-06-20 02:06  hikoukay  阅读(135)  评论(0编辑  收藏  举报

概念

桥接(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】