设计模式-桥接模式

目录

🧂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();
    }
}
相关推荐
workflower3 分钟前
Prompt Engineering的重要性
大数据·人工智能·设计模式·prompt·软件工程·需求分析·ai编程
Allen Bright27 分钟前
【Java基础-46.3】Java泛型通配符详解:解锁类型安全的灵活编程
java·开发语言
柃歌30 分钟前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法
柃歌40 分钟前
【UCB CS 61B SP24】Lecture 4 - Lists 2: SLLists学习笔记
java·数据结构·笔记·学习·算法
是姜姜啊!1 小时前
redis的应用,缓存,分布式锁
java·redis·spring
梨落秋溪、1 小时前
输入框元素覆盖冲突
java·服务器·前端
hrrrrb1 小时前
【Java】Java 常用核心类篇 —— 时间-日期API(上)
java·开发语言
小突突突1 小时前
模拟实现Java中的计时器
java·开发语言·后端·java-ee
七禾页话1 小时前
垃圾回收知识点
java·开发语言·jvm
web137656076431 小时前
Scala的宝藏库:探索常用的第三方库及其应用
开发语言·后端·scala