设计模式-桥接模式

目录

🧂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();
    }
}
相关推荐
小毛驴85025 分钟前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
DKPT1 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好奇的菜鸟2 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
tan180°2 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
努力的小雨3 小时前
点我!1分钱获取你的专属表白网页,浪漫由大模型代运营
经验分享·ai智能
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社24 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
why技术4 小时前
Stack Overflow,轰然倒下!
前端·人工智能·后端
幽络源小助理4 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码4 小时前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot