灯的演化与桥接模式

在了解桥接模式之前,我们先来看看

  1. 从材料的角度看,灯管是灯的核心
  2. 从功能和使用场景看,单纯的灯又能分为台灯、吊灯等

从不同的角度看灯
这样一组合,仅仅是按照上面的图中的场景算,也有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();
    }
}

运行结果

在这里插入图片描述

总结

  1. 桥接模式概念中所说的抽象部分与实现部分有些晦涩,但是按照我的理解应该是整体有整体的演化,局部有局部的演化。比如灯本身可以分为台灯、吊灯和路灯等,灯所使用的灯管也可以分为荧光灯管和LED灯管。
  2. 多用组合,少用继承。动态组合可以让系统更加灵活。
  3. 桥接模式与装饰模式不同,桥接模式是创建了一个对象,而装饰模式是在一个对象创建后,不断的赋予新的功能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值