桥接模式详解

1.简介

在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于Photoshop这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m种形状和n种颜色的图形就有m*n种,不但对应的子类很多,而且扩展困难。
当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。

2.定义

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

3.优点

  1. 抽象和实现分离,扩展能力强。
  2. 符合开闭原则。
  3. 符合合成复用原则。
  4. 其实现细节对客户透明。

4.缺点

由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的细节和设计难度。

5.结构

桥接模式(Bridge)模式包含以下主要角色:

  1. 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  2. 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  3. 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
  4. 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
    结构图:
    在这里插入图片描述

6.应用场景

当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。
桥接模式通常适用于以下场景:

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

桥接模式的一个常见使用场景就是替换继承。继承拥有很多优点,比如:抽象、封装、多态等,父类封装共性,子类实现特性。继承可以很好的实现代码复用的功能,但这也是继承的一大缺点。因为父类拥有的方法,子类也会继承得到,无论子类需不需要,这说明继承具有强侵入性,同时会导致子类臃肿。因此,在设计模式中,有一个原则为优先使用组合/聚合,而不是继承。

7.代码样例

1.简单样例

interface Implementor{
    void operationImpl();
}
class ConcreteImplementorA implements Implementor{
    @Override
    public void operationImpl() {
        System.out.println("具体化实现A角色被访问!");
    }
}
abstract class Abstraction{
    protected Implementor impl;
    protected Abstraction(Implementor impl){
        this.impl = impl;
    }
    public abstract void operation();
}
class RefinedAbstraction extends Abstraction{
    protected RefinedAbstraction(Implementor impl){
        super(impl);
    }
    @Override
    public void operation() {
        System.out.println("扩展抽象化角色被访问!");
        impl.operationImpl();
    }
}
public class BridgeTest {
    public static void main(String[] args){
        Implementor impl = new ConcreteImplementorA();
        Abstraction abs = new RefinedAbstraction(impl);
        abs.operation();
    }
}

2.应用实例

用桥接模式模拟女士皮包的选购。
分析:女士皮包有很多种,可以按用途、皮质、品牌、颜色分、大小分等划分,存在多个维度的变化,所以采用桥接模式来实现女士皮包的选购比较合适。
当前实例按用途分钱包(Wallet)和挎包(HandBag),按颜色分黄色(Yellow)和红色(Red)。按两个维度定义为颜色类和包类。
客户类通过ReadXml

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值