【软考】设计模式之桥接模式

1. 说明
  • 1.将抽象部分与其实现部分分离,使它们都可以独立地变化。
  • 2.桥接模式(Bridge Pattern)属于对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
2. 应用场景
  • 1.图形界面库:图形界面库提供了一组通用的界面元素(如按钮、文本框、下拉菜单等),同时也提供了多种不同的绘制方式(如窗口系统的绘制、OpenGL的绘制等)。通过使用桥接模式,可以将界面元素和绘制方式解耦,使得它们可以独立地变化。
  • 2.电子商务平台:在电子商务平台中,商品和展示方式可以看作是两个独立变化的维度。桥接模式可以将它们进行解耦,使得商品和展示方式可以独立变化。
  • 3.操作系统的文件系统:文件系统可以支持多种存储介质(如磁盘、光盘、网络存储等),同时也可以支持多种文件系统类型(如FAT32、NTFS、EXT4等)。桥接模式可以将存储介质和文件系统类型进行解耦,使得它们可以独立变化。
  • 4.游戏开发中的人物角色:在游戏开发中,人物角色通常具有多种不同的属性和技能(如力量、敏捷、法力等)。这些属性和技能可以看作是两个独立变化的维度。桥接模式可以将它们进行解耦,使得人物角色的属性和技能可以独立变化。
3. 结构图

在这里插入图片描述

4. 构成
  • 1.Abstraction(抽象化角色):定义抽象类的接口,并包含一个对实现化对象的引用。
  • 2.RefinedAbstraction(扩展抽象化角色):扩充由Abstraction定义的接口。是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 3.Implementor(实现化角色):定义实现类接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来说,Implementor接口仅提供基本操作,而Abstraction定义了基于这些基本操作的较高层次的操作。
  • 4.ConcreteImplementor实现Implementor接口并定义它的具体实现。
5. 适用性
  • 1.不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如,这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
  • 2.类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这是 Bridge 模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充
  • 3.对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译。
  • 4.(C++)想对客户完全隐藏抽象的实现部分
  • 5.有许多类要生成的类层次结构。
  • 6.想在多个对象间共享实现(可能使用引用计数),但同时要求客户并不知道这一点。
6. 优点
  • 1.分离抽象接口及其实现部分:桥接模式允许将抽象与实现解耦,使得抽象和实现可以独立地变化。这有助于降低系统的耦合性,提高系统的灵活性和可扩展性。

  • 2.提高可重用性:由于抽象和实现之间的分离,桥接模式可以提高代码的可重用性。例如,当需要实现不同的具体实现时,只需要更改实现部分,而无需修改抽象部分。

  • 3.支持动态组合:桥接模式使用对象间的组合关系替代了继承关系,使得系统可以更加灵活地进行动态组合。这有助于降低系统的复杂性,提高系统的可维护性。

7. 缺点
  • 1.增加系统的理解与设计难度:由于桥接模式需要在抽象层进行设计和编程,这可能会增加系统的理解与设计难度。开发者需要一开始就针对抽象层进行设计与编程,这需要一定的技术水平和经验。
  • 2.识别独立变化的维度:在系统中正确识别出两个独立变化的维度并不是一件容易的事情。这需要对系统有深入的理解和分析,才能准确地找到这两个维度。
  • 3.可能导致类的数量增加:桥接模式将抽象部分与实现部分分离,这可能会导致系统中类的数量增加。这可能会增加系统的复杂性,需要更加仔细地设计和管理代码。
8. java示例
  • 1.衣服抽象类Abstraction
package com.learning.bridge;

/**
 * 衣服抽象类
 */
public abstract class Clothing {
    // 桥接的部分,通过Color接口与实现部分连接
    protected Color color;

    public Clothing(Color color) {
        this.color = color;
    }

    public abstract void showColor();
} 
  • 2.衬衫类RefinedAbstraction
package com.learning.bridge;

/**
 * 衬衫
 */
public class Shirt extends Clothing {
    // 桥接的部分,通过Color接口与实现部分连接
    public Shirt(Color color) {
        super(color);
    }
  
    @Override
    public void showColor() {  
        System.out.println("The shirt is " + color.getColorName() + ".");
    }  
}

  • 3.颜色类Implementor
package com.learning.bridge;

/**
 * 颜色接口
 */
public interface Color {
	// 获取颜色
    String getColorName();  
}  

  • 4.红色类ConcreteImplementor
package com.learning.bridge;

/**
 * 红色
 */
public class RedColor implements Color {  
    @Override  
    public String getColorName() {  
        return "red";  
    }  
}  

  • 5.蓝色类ConcreteImplementor
package com.learning.bridge;

/**
 * 蓝色
 */
public class BlueColor implements Color {  
    @Override  
    public String getColorName() {  
        return "blue";  
    }  
}
  • 8.客户端
package com.learning.bridge;

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {  
        // 创建一个红色的衬衫  
        Clothing redShirt = new Shirt(new RedColor());  
        redShirt.showColor();

        // 创建一个蓝色的衬衫(不需要修改Shirt类的代码)  
        Clothing blueShirt = new Shirt(new BlueColor());  
        blueShirt.showColor();
    }  
}
  • 7.示例截图
    在这里插入图片描述
  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王佑辉

老板,赏点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值