设计模式08-桥接模式

介绍


为了让抽象化和实现化解耦,两者可以独立扩展,对于抽象类的改变,不会影响到使用。所以出现了桥接,提供了抽象化和实现化的桥接结构,实现解耦


意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

关键代码:抽象类依赖实现类。

优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。

缺点:增加复杂度

使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

注意事项:对于两个独立变化的维度,使用桥接模式再适合不过了。

实例


假如是一个标准的继承模式,应该是这样的。
这里写图片描述

用户如果想画圆,相当简单。因为是继承,秉持里氏代换,父类出现的地方,子类也可以出现。所以直接创建对象即可。
那我现在想画方块呢?对,也可以直接向Clrcle一样继承Shape即可。就是这样了
这里写图片描述
问题来了,我现在想画一个红色的圆,还想画一个蓝色的圆怎么办?有四种方法。
1.创建RedClrcle和BlueCircle,与正方形,Circle一样处于同一阶层,继承Shape。但是这样不对,按理说,RedClrcle与BlueCircle应该是圆的子类啊,不应该处于同一阶层,这混乱了。
2.那行吧,我们把Circle当成父类,RedClrcle和BlueCircle继承它。这样就行了。但是这样的多继承,似乎不太好,如果Shape改动一下,哗啦一下,下面Circle和RedClrcle和BlueCircle全崩了。
3.那行吧,我们在Shape里面创建一个方法,叫drawRedCircle(),这样Circle就可以实现它了。但是Square怎么办?它也实现Shape,难不成你想在方块里画圆?这违背了单一职责和接口隔离。
4.最后,就涉及到我们的桥接模式了。我们把可能会发生多种变化的抽离出来,让他成为一个接口,独立变化。比如这里,我们抽离draw()方法。我们创建一个DrawShape的接口,他里面有draw()方法。这样一来,抽象Shape和实现Draw就进行了抽离,成了两个体系,都可以各自发展。

这里写图片描述

在上面我们还添加了蓝色方块和红色方块,这是具体的实现,都可以抽离出来成为一个体系。

抽象体系

超类

public abstract class Shape {

    //注意,不能设置为private,因为这样子类继承不到
    protected DrawShape drawShape;

    public Shape(DrawShape drawShape) {
        this.drawShape = drawShape;
    }

    public abstract void draw();
}

子类

public class Circle extends Shape{
    public Circle(DrawShape drawShape) {
        super(drawShape);
    }

    @Override
    public void draw() {
        drawShape.draw();
    }
}

实现体系

超类

public interface DrawShape {

    public void draw();
}

子类

public class DrawBlueCircle implements DrawShape {

    @Override
    public void draw() {
        System.out.println("我画了一个蓝色的圆");
    }

}
public class DrawRedCircle implements DrawShape {

    @Override
    public void draw() {
        System.out.println("我画了一个红色的圆");
    }

}

用户

public class Client {
    public static void main(String[] args) {
        Shape redCircle = new Circle(new DrawRedCircle());
        redCircle.draw();
        Shape blueCircle = new Circle(new DrawBlueCircle());
        blueCircle.draw();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值