设计模式-桥接模式

目录

🧂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();
    }
}
相关推荐
骁的小小站3 分钟前
HDLBits刷题笔记和一些拓展知识(十一)
开发语言·经验分享·笔记·其他·fpga开发
夜阳朔7 分钟前
Conda环境激活失效问题
人工智能·后端·python
前端付豪7 分钟前
13、表格系统架构:列配置、嵌套数据、复杂交互
前端·javascript·架构
人生在勤,不索何获-白大侠10 分钟前
day17——Java集合进阶(Collections、Map)
java·开发语言
JustHappy15 分钟前
SPA?MPA?有啥关系?有啥区别?聊一聊页面形态 or 路由模式
前端·javascript·架构
程序员小羊!22 分钟前
Java教程:JavaWeb ---MySQL高级
java·开发语言·mysql
白仑色29 分钟前
Spring Boot 多环境配置详解
java·spring boot·后端·微服务架构·配置管理
懒斌30 分钟前
linux驱动程序
后端
超级小忍32 分钟前
在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
java·spring boot·后端
David爱编程36 分钟前
Java 中 Integer 为什么不是万能的 int 替代品?
java·后端