设计模式-桥接模式

目录

🧂1.桥接模式

🌭2.优缺点

🥓3.关键角色

🍿4.使用场景

🥞5.实例解析


1.桥接模式

  • 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。
  • 这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
  • 将抽象部分与实现部分分离,使它们都可以独立的变化

2.优缺点

优点:

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

缺点:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

3.关键角色

  • 1.抽象(Abstraction):定义抽象接口,通常包含对实现接口的引用。
  • 2.扩展抽象(Refined Abstraction):对抽象的扩展,可以是抽象类的子类或具体实现类。
  • 3.实现(Implementor):定义实现接口,提供基本操作的接口。
  • 4.具体实现(Concrete Implementor):实现实现接口的具体类。

4.使用场景

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

5.实例解析

我们需要构建一个手机类,我们知道手机有很多品牌,苹果、华为等,从另外一个颜色维度,又有多种颜色,红、黄、蓝等~

  • 1.创建抽象类-手机

使用abstract创建抽象类

java 复制代码
/**
 * 抽象类
 */
public abstract class Phone {


    /**
     * 通过组合的方式,来桥接其他行为
     */
    protected Color color;

    /**
     * 手机的方法
     */
    abstract public void run();

    public void setColor(Color color) {
        this.color = color;
    }
}

为什么非要使用abstract呢?不使用也能继承啊?

  • 大佬的回答通过定义抽象类,并要求具体子类实现其中的抽象方法,让桥接模式的使用具有良好的扩展性;使用抽象类是为了定义一组通用的接口规范,确保子类都遵循相同的接口
  • 2.创建颜色接口
java 复制代码
/**
 * 抽象接口
 */
public interface Color {

    void userColor();
}
  • 3.实现颜色接口的具体实现类
java 复制代码
/**
 * 扩展抽象-具体的抽象实现类
 */
public class BlueColor implements Color{
    @Override
    public void userColor() {
        System.out.println("蓝色~");
    }
}


/**
 * 扩展抽象-具体的抽象实现类
 */
public class RedColor implements Color {
    @Override
    public void userColor() {
        System.out.println("红色~");
    }
}


/**
 * 扩展抽象-具体的抽象实现类
 */
public class YellowColor implements Color {
    @Override
    public void userColor() {
        System.out.println("黄色~");
    }
}
  • 4.创建继承抽象类的具体类

通过构造器的方式,实现组合

java 复制代码
/**
 * 具体的实现类
 */
public class ApplePhone extends Phone {

    /**
     * 组合颜色
     * @param color
     */
    public ApplePhone(Color color) {
        super.setColor(color);
    }

    @Override
    public void run() {
        color.userColor();
        System.out.println("苹果手机");
    }
}

/**
 * 具体的实现类
 */
public class HWPhone extends Phone {
    
    /**
     * 组合颜色
     *
     * @param color
     */
    public HWPhone(Color color) {
        super.setColor(color);
    }


    @Override
    public void run() {
        color.userColor();
        System.out.println("华为");
    }
}
  • 5.测试
java 复制代码
public class Main {

    public static void main(String[] args) {
        HWPhone hwPhone = new HWPhone(new BlueColor());
        hwPhone.run();

        System.out.println("===============================");

        ApplePhone applePhone = new ApplePhone(new RedColor());
        applePhone.run();
    }
}
相关推荐
码事漫谈4 小时前
VSCode CMake Tools 功能解析、流程与最佳实践介绍
后端
ZouZou老师4 小时前
C++设计模式之解释器模式:以家具生产为例
c++·设计模式·解释器模式
鸽鸽程序猿4 小时前
【项目】【抽奖系统】抽奖
java·spring
火云牌神4 小时前
本地大模型编程实战(38)实现一个通用的大模型客户端
人工智能·后端
码事漫谈5 小时前
从C++/MFC到CEF与TypeScript的桌面架构演进
后端
GoogleDocs5 小时前
基于[api-football]数据学习示例
java·学习
卓码软件测评5 小时前
第三方软件验收评测机构【Gatling安装指南:Java环境配置和IDE插件安装】
java·开发语言·ide·测试工具·负载均衡
妮妮分享5 小时前
H5获取定位的方式是什么?
java·前端·javascript
Billow_lamb5 小时前
MyBatis-Plus 的 条件构造器详解(超详细版)
java·mybatis
CoderYanger5 小时前
动态规划算法-两个数组的dp(含字符串数组):48.最长重复子数组
java·算法·leetcode·动态规划·1024程序员节