设计模式学习笔记:桥接模式(Bridge)

少壮不努力,老大徒伤悲。

一、桥接模式简介

桥接模式是设计模式中结构型模式的一种。桥接的作用是把抽象化和实例化解耦,使二者可以独立变化。桥接模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。使得实体类和实现类可以被结构化的改变而不互相影响。

桥接模式最适合用来解决由多种变化维度导致的继承类爆炸式增长的问题。

二、适用场景举例

场景如下:

家具有很多种,例如桌子、椅子等,每种家具根据不同的材料又可以有不同的分类。如果用继承的方式设计,那么设计如下:

未使用桥接模式的继承设计方式1

如果要增加一种材料,那么需要修改如下:

未使用桥接模式的继承设计方式变化1

如果要再增加一种家具,需要修改如下:

未使用桥接模式的继承设计方式变化2

从以上设计可以看出,每变化一种维度,类的数量就呈现爆炸式的增长。这种实现方式显然不是我们想要的方式。

遇到这种具有多种变化维度的系统,就可以使用桥接模式来设计。

三、桥接模式的解决方案

对于以上场景,可以把家具的种类抽象出一个抽象类,把材料抽象出一个接口,然后设计类图如下:

桥接模式解决方案设计图

这样设计之后无论使增加家具的类型还是增加材料的类型都不会影响到另一个维度的变化,从而解决继承方式导致的类爆炸问题。

四、代码演示桥接模式

Material(材料接口)

/**
 * 材料接口
 *
 * @author ZhengNC
 * @date 2020/9/1 9:55
 */
public interface Material {

    /**
     * 获取材料
     *
     * @return
     */
    String getMaterial();
}

Wood(木头)

/**
 * 木头
 *
 * @author ZhengNC
 * @date 2020/9/1 9:59
 */
public class Wood implements Material {
    @Override
    public String getMaterial() {
        return "木";
    }
}

Iron(铁)

/**
 * 铁
 *
 * @author ZhengNC
 * @date 2020/9/1 10:04
 */
public class Iron implements Material {
    @Override
    public String getMaterial() {
        return "铁";
    }
}

Furniture(抽象家具)

/**
 * 抽象家具
 *
 * @author ZhengNC
 * @date 2020/9/1 9:57
 */
public abstract class Furniture {

    protected Material material;

    public Furniture(Material material){
        this.material = material;
    }

    /**
     * 打印家具的名字
     */
    public abstract void printName();
}

Table(桌子)

/**
 * 桌子
 *
 * @author ZhengNC
 * @date 2020/9/1 10:04
 */
public class Table extends Furniture {
    public Table(Material material) {
        super(material);
    }

    @Override
    public void printName() {
        System.out.println(material.getMaterial() + "桌子");
    }
}

Chair(椅子)

/**
 * 椅子
 *
 * @author ZhengNC
 * @date 2020/9/1 10:07
 */
public class Chair extends Furniture {
    public Chair(Material material) {
        super(material);
    }

    @Override
    public void printName() {
        System.out.println(material.getMaterial() + "椅子");
    }
}

Bed(床)

/**
 * 床
 *
 * @author ZhengNC
 * @date 2020/9/1 10:08
 */
public class Bed extends Furniture {
    public Bed(Material material) {
        super(material);
    }

    @Override
    public void printName() {
        System.out.println(material.getMaterial() + "床");
    }
}

五、测试桥接模式代码

/**
 * 测试桥接模式
 *
 * @author ZhengNC
 * @date 2020/9/1 10:09
 */
public class TestBridge {

    public static void main(String[] args) {
        //新建木桌子
        Furniture table = new Table(new Wood());
        table.printName();

        //新建铁椅子
        Furniture chair = new Chair(new Iron());
        chair.printName();

        //新建木床
        Furniture bed = new Bed(new Wood());
        bed.printName();
    }
}

输出结果:

木桌子
铁椅子
木床

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值