设计模式之桥接模式

什么是桥接模式

桥接模式是讲抽象部分与它的实现部分分离,使他们都可以独立地进行变化。

  • 需要注意的是这里说的抽象与实现分离,并非类似抽象类与其派生类分离。实现部分指的是抽象类和他的派生类用来实现自己的对象。

说通俗点,就是实现系统可能有多角度分类,每一种分类都有变化的可能,那么把这种多角度分离出来让他们独立变化,减少他们之间的耦合,便是桥接模式的使用。

原理图

在这里插入图片描述

为什么要用桥接模式

试想市面上的手表:

  • 按功能分,可以分为普通手表、智能手表等
  • 按外形分,可以分为圆形手表、方形手表等

现在,想要选一只手表,总共有多少选择?

答案很明显,是4种,分别是圆形普通手表、方形普通手表、圆形智能手表、方形智能手表。

这四种手表的关系如下图:

在这里插入图片描述

但是这样很明显就有一个问题:

  • 市面上多出一种功能的手表怎么办?比如户外手表
  • 市面上多出一种外形的手表怎么办?比如长方形的手表

如果要做增加,将直接增加类的数量,且增加一点,对整个项目的结构就会有很大影响,是明显违背开闭原则的,同时也会面临“类爆炸”的问题。


那该如何避免上述问题呢?

使用桥接模式:

我们重新看一下问题描述,我们已经有了两种划分方式:按功能分、按外形分。

是啊,有两种划分方法,但是怎么共同表示一个产品呢?

当然是把两种方式连接起来啊,那不就有了一个共同描述的产品了吗(要充分运用合成复用原则,使用组合的方式,降低两个类的耦合程度):
在这里插入图片描述

怎么理解这里用了桥接模式?

现在想要一个圆形普通手表,那么需要的是普通手表和圆形两个类,这两个类需要联合使用,那么他们是怎么联合起来的:通过手表形状两个类进行链接,这两类可以想象成一座桥,这座桥将两个类连接起来,故称为“桥接模式”。

用代码实现一下吧:

手表类:

public abstract class Watch {
    private Shape shape;

    Watch(Shape shape){
        this.shape = shape;
    }

    public abstract void printType();

    public void printWatchModel(){
        shape.printShape();
        printType();
    }
}

形状类:

public abstract class Shape {
    public abstract void printShape();
}

普通手表:

public class Common extends Watch {
    Common(Shape shape) {
        super(shape);
    }

    @Override
    public void printType() {
        System.out.println("普通手表");
    }
}

智能手表:

public class Smart extends Watch {
    Smart(Shape shape) {
        super(shape);
    }

    @Override
    public void printType() {
        System.out.println("智能手表");
    }
}

圆形类:

public class Circle extends Shape {
    @Override
    public void printShape() {
        System.out.println("圆形");
    }
}

方形类:

public class Square extends Shape {
    @Override
    public void printShape() {
        System.out.println("方形");
    }
}

做出选择的用户:

public class User {
    public static void main(String[] args) {
        Watch watch = new Smart(new Circle());
        watch.printWatchModel();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值