结构型模式(二):桥接模式

1、模式的定义与特点

桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化。
它是用组合/聚合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

优点:
1、由于抽象与实现分离,所以扩展能力强;
2、其实现细节对客户透明。

缺点:
由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。

2、模式的结构

桥接模式包含以下主要角色:
1、抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
2、扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
3、实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
4、具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

其结构如图1所示。
在这里插入图片描述

图1 桥接模式的结构图

3、模式的应用场景

桥接模式通常适用于以下场景:
1、当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
2、当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
3、当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

4、模式的扩展

在软件开发中,有时桥接模式可与适配器模式联合使用。
当桥接模式的实现化角色的接口与现有类的接口不一致时,可以在二者中间定义一个适配器将二者连接起来,其具体结构如图2所示。
在这里插入图片描述

图2 桥接模式与适配器模式联用的结构图

5、模式的实现

在这里插入图片描述

图3 示例代码结构

抽象化角色:

package com.example.designpattern.bridge;

/**
 * @author Administrator
 * @date 2020/7/29
 * 抽象化角色
 * 持有一个实现化角色的引用,完成组合关系
 * 利用这个组合关系来代替抽象类继承实现的方式
 */
abstract class AbstractCoffee {
    public ICoffeeImplementor coffeeImplementor;

    public ICoffeeImplementor getCoffeeImplementor() {
        return coffeeImplementor;
    }

    public void setCoffeeImplementor(ICoffeeImplementor coffeeImplementor) {
        this.coffeeImplementor = coffeeImplementor;
    }

    public void pourCoffee() {
        coffeeImplementor.pourCoffeeImpl();
    }
}

实现化角色:

package com.example.designpattern.bridge;

/**
 * @author Administrator
 * @date 2020/7/29
 * 实现化角色接口
 */
interface ICoffeeImplementor {
    public void pourCoffeeImpl();
}

扩展抽象化角色1:

package com.example.designpattern.bridge;

/**
 * @author Administrator
 * @date 2020/7/29
 * 扩展抽象化角色
 */
class BigCoffee extends AbstractCoffee {
    @Override
    public void pourCoffee() {
        System.out.print("使用大杯");
        this.coffeeImplementor.pourCoffeeImpl();
    }
}

扩展抽象化角色2:

package com.example.designpattern.bridge;

/**
 * @author Administrator
 * @date 2020/7/29
 * 扩展抽象化角色
 */
class MidCoffee extends AbstractCoffee {
    @Override
    public void pourCoffee() {
        System.out.print("使用中杯");
        this.coffeeImplementor.pourCoffeeImpl();
    }
}

具体实现化角色1:

package com.example.designpattern.bridge;

/**
 * @author Administrator
 * @date 2020/7/29
 * 具体实现化角色
 */
class MilkCoffeeImpl implements ICoffeeImplementor {
    @Override
    public void pourCoffeeImpl() {
        System.out.println("加奶咖啡");
    }
}

具体实现化角色2:

package com.example.designpattern.bridge;

/**
 * @author Administrator
 * @date 2020/7/29
 * 具体实现化角色
 */
class NoMilkCoffeeImpl implements ICoffeeImplementor {
    @Override
    public void pourCoffeeImpl() {
        System.out.println("不加奶咖啡");
    }
}

调用:

package com.example.designpattern.bridge;

/**
 * @author Administrator
 * @date 2020/7/29
 */
class Client {
    public static void main(String[] args) {
        //大杯加奶咖啡
        AbstractCoffee abstractCoffee = new BigCoffee();
        abstractCoffee.setCoffeeImplementor(new MilkCoffeeImpl());
        abstractCoffee.pourCoffee();

        //中杯不加奶咖啡
        AbstractCoffee abstractCoffee1 = new MidCoffee();
        abstractCoffee1.setCoffeeImplementor(new NoMilkCoffeeImpl());
        abstractCoffee1.pourCoffee();
    }
}

测试结果:
在这里插入图片描述

图4 测试结果

6、PPT素材

在这里插入图片描述

PPT 01

在这里插入图片描述

PPT 02

在这里插入图片描述

PPT 03

在这里插入图片描述

PPT 04

在这里插入图片描述

PPT 05

在这里插入图片描述

PPT 06

在这里插入图片描述

PPT 07

在这里插入图片描述

PPT 08

在这里插入图片描述

PPT 09

在这里插入图片描述

PPT 10

微信公众号: TechU
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值