桥接模式(bridge)

原文链接:二十三种设计模式~~~~~桥接模式(bridge) – 编程屋

目录

1 前言:

 2 实现方法类比

3 桥接模式

3.1 桥接模式简单介绍

3.2 代码实现  

4 桥接模式优缺点


1 前言:

        在我们平时生活中,会有很多按照不同功能来进行区分的东西,比如电脑(华为电脑,苹果电脑),但是电脑又有许多种分类(笔记本,台式、平板)。这两种两两组合,就可以组合成很多种不同品牌类型的电脑。于是我们可以将两个电脑品牌和电脑种类看成两个维度。让它们任意组合,这样品牌和类型的改动互补影响,耦合度很低。

 2 实现方法类比

如果我们用多继承来实现功能,会是什么样子呢?

我们可以发现,这个时候如果想要在继续添加一种类型的电脑,那么我们还需要添加3种不同品牌这种类型的电脑,添加几种就需要额外添加3n种品牌的电脑。这样的话会使得我们的整体代码结构变的异常臃肿。

那么,由此可见采用继承的方式并不是最佳的解决方案,我们就可以想到将品牌和类型抽取出来,需要什么就可以组合什么,完全不需要写出多余的代码。这需要一个桥将品牌和类型连接起来,这就出现了我们的另外一种设计模式-----桥接模式。

其中这种方法设计到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。这样就实现了品牌和类型的分离,用户可以自由的根据品牌和类型来选取自己喜欢的电脑

3 桥接模式

3.1 桥接模式简单介绍

        桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化。它是一种对象结构型模式,又称为柄体模式或接口模式。桥接模式将继承关系转换为关联关系,它降低了类和类之间的耦合度      

桥接模式所涉及角色:

抽象化角色: 抽象给出的定义,并保存一个对实现化对象的引用

修正抽象化角色: 扩展抽象化角色,改变和修正父类对抽象化的定义

实现化角色: 这个角色给出实现化的接口,但不给出具体的实现。必须指出的是这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样,实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。

具体实现化角色:这个角色给出实现化角色接口的具体实现。

3.2 代码实现  

在桥接模式中,首先将电脑按照种类(笔记本,台式,平板)进行子类化。每一种品牌的电脑选择什么种类,比如华为笔记本,华为台式,苹果平板等等,让他们自由组合,不再使用子类扩充,而是通过一个抽象的修正类,以组合的形式引入。我们先定义一个抽象类ComputerType电脑种类,它引用了电脑品牌Brand

步骤一: 创建抽象化部份:

//抽象的电脑类型
public abstract class ComputerType {

    //引用电脑品牌
    protected Brand brand;

    //将电脑类型和品牌组合起来(相当于桥接模式中的桥)
    public ComputerType(Brand brand) {
        this.brand = brand;
    }
    public abstract void orderCpmputer();

}

这样我们将我们的电脑类型和电脑品牌联系起来了,我们在ComputerType类中加入了电脑品牌brand的引用,并且通过构造函数注入。其实这一部分就相当于桥接模式中的桥。

步骤二:创建品牌接口

//电脑品牌
public interface Brand {
    void info();
}

步骤三: 定义修正的抽象类中RefindComputer

public abstract class RefindComputer extends ComputerType{

    public RefindComputer(Brand brand) {
        super(brand);
    }

    public void orderComputer(){
        this.brand.info();
        System.out.println("orderComputer"+getOrderInfo()+"computer");
    }

    public abstract String getOrderInfo();

}

步骤四:让不同的品牌和种类分别继承对应的父类

苹果和华为品牌继承品牌父类:

class Apple implements Brand{

    @Override
    public void info() {
        System.out.println("苹果电脑");
    }
}

class Huawei implements Brand{
    @Override
    public void info() {
        System.out.println("华为电脑");
    }
}

台式机和笔记本种类继承电脑种类父类

//电脑种类---台式机
 class Desktop extends RefindComputer{


    public Desktop(Brand brand) {
        super(brand);
    }

    @Override
    public String getOrderInfo() {
        return "台式机";
    }

    @Override
    public void orderCpmputer(int count) {

    }

}

//电脑种类---笔记本
class Laptop extends RefindComputer{


    public Laptop(Brand brand) {
        super(brand);
    }

    @Override
    public void orderCpmputer(int count) {

    }

    @Override
    public String getOrderInfo() {
        return "笔记本";
    }
}

步骤五:客户端测试类

public class Client {
    //用户自由组装不同品牌种类的电脑
    public static void main(String[] args) {
        RefindComputer computer = new Desktop(new Apple());
        computer.orderComputer();

    }
}

由此 我们就可以组装成功我们的苹果台式机了。

4 桥接模式优缺点

优点:

        分离抽象接口和其实现部分。桥接模式使用对象间的关联关系解耦了抽象和其实现之间固有的绑定关系,使得抽象类和实现可以沿着各自的维度来变化

        桥接模式提高了系统的可扩展性,在两个变化维度中随意扩展一个维度都不需要修改原有体系系统,符合开闭原则

        在很多清凉下,桥接模式可以取代多层继承方案,多层继承方案违背了"单一职责原则",复用性较差,且类的个数较多,桥接模式大大减少了类的个数。

缺点:

        桥接模式的使用会增加系统理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就对抽象层进行设计和编程。

        桥接模式要求正确识别出系统两个独立变化的维度,因此其使用范围有一定局限性。

以上只是部分内容,为了维护方便,本文已迁移到新地址:二十三种设计模式~~~~~桥接模式(bridge) – 编程屋

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值