灯
在了解桥接模式之前,我们先来看看灯。
- 从材料的角度看,灯管是灯的核心
- 从功能和使用场景看,单纯的灯又能分为台灯、吊灯等
这样一组合,仅仅是按照上面的图中的场景算,也有6种组合了。针对上面这种业务场景,我们在程序中应该如何应对呢?
桥接模式
桥接模式将抽象部分与它的实现部分分离开来,使他们都可以独立变化。桥接模式将类之间静态的继承关系转化为动态的组合关系,使系统更加灵活易扩展,同时有效的控制了系统中类的数量。
实践
ILightTube 灯管
/**
* 灯管
*/
public interface ILightTube {
/**
* 灯管发光
*/
void shine();
}
AbstractLight 抽象的灯
/**
* 抽象的灯
* @author skyline
*/
public abstract class AbstractLight {
private final ILightTube lightTube;
private final Logger logger = LoggerFactory.getLogger(this.getClass());
protected AbstractLight(ILightTube lightTube) {
this.lightTube = lightTube;
}
/**
* 发光
*/
public void shine(){
lightTube.shine();
logger.info("{}用{}发光了",this.getClass().getSimpleName(),lightTube.getClass().getSimpleName());
}
}
灯在功能方面的扩展
/**
* 台灯
* @author skyline
*/
public class DeskLamp extends AbstractLight{
protected DeskLamp(ILightTube lightTube) {
super(lightTube);
}
}
/**
* 吊灯
* @author skyline
*/
public class Chandelier extends AbstractLight{
protected Chandelier(ILightTube lightTube) {
super(lightTube);
}
}
/**
* 路灯
* @author skyline
*/
public class StreetLight extends AbstractLight{
protected StreetLight(ILightTube lightTube) {
super(lightTube);
}
}
灯在材料方面的扩展
/**
* 荧光灯管
* @author skyline
*/
public class FluorescentTube implements ILightTube{
private static final Logger logger = LoggerFactory.getLogger(FluorescentTube.class);
@Override
public void shine() {
logger.info("荧光灯");
}
}
/**
* LED灯管
* @author skyline
*/
public class LEDTube implements ILightTube{
private static final Logger logger = LoggerFactory.getLogger(LEDTube.class);
@Override
public void shine() {
logger.info("LED灯");
}
}
BridgeMain
public class BridgeMain {
public static void main(String[] args) {
//led台灯
DeskLamp ledDeskLamp = new DeskLamp(new LEDTube());
ledDeskLamp.shine();
//普通台灯
DeskLamp ordinaryDeskLamp = new DeskLamp(new FluorescentTube());
ordinaryDeskLamp.shine();
//led吊灯
Chandelier ledChandelier = new Chandelier(new LEDTube());
ledChandelier.shine();
}
}
运行结果
总结
- 桥接模式概念中所说的抽象部分与实现部分有些晦涩,但是按照我的理解应该是整体有整体的演化,局部有局部的演化。比如灯本身可以分为台灯、吊灯和路灯等,灯所使用的灯管也可以分为荧光灯管和LED灯管。
- 多用组合,少用继承。动态组合可以让系统更加灵活。
- 桥接模式与装饰模式不同,桥接模式是创建了一个对象,而装饰模式是在一个对象创建后,不断的赋予新的功能。