设计模式-桥接模式

目录

🧂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();
    }
}
相关推荐
朱容zr33313312 分钟前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
用户6081865279022 分钟前
一文吃透 Avalonia 布局容器|Grid 到 UniformGrid 核心用法 + 语法糖实战
后端
Ai拆代码的曹操37 分钟前
Dubbo 线程池爆满排坑:Linux 用户线程数限制,一个容易被忽略的根因
后端·源码阅读
知彼解己44 分钟前
Eclipse Temurin:企业级 Java JDK 发行版的最佳实践
java·ide·eclipse
朱容zr3331331 小时前
请解释“回表”的概念。
java·前端·数据库
不吃辣4901 小时前
vibe coding | 如何做一个 AI 音乐生成工具?
java·人工智能·后端·ai·ai编程
啦啦啦啦啦zzzz1 小时前
设计模式:建造者模式
c++·设计模式·建造者模式
NWU_LK1 小时前
【WebFlux】第八篇 —— 自定义调度器
java
开心的AI频道1 小时前
AI 完形填空写作法:4 条提示词
经验分享
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第210题】【10_网络协议篇】第1题:说说 TCP/IP 网络五层模型
java·网络协议·tcp/ip·计算机网络·网络五层模型