Java结构型模式之桥接模式详解

Java结构型模式之桥接模式详解

概述

桥接模式是一种用于软件设计的结构型模式,最早由著名的设计模式书籍《设计模式:可复用面向对象软件的基础》中的Gamma等人提出。

桥接模式的主要目的是将抽象部分和实现部分分离,分别放在不同的类层次结构中,从而实现它们之间的独立变换。通过分离抽象部分和实现部分,可以使它们可以相对独立地变化,从而可以大大降低它们之间的耦合度,提高系统的可扩展性、可维护性。

结构

桥接模式的主要结构包括如下几个角色:

Abstraction(抽象部分)

抽象部分为桥接模式中的抽象类。它定义了一些抽象方法和属性,定义了一个指向 Implementor 类型对象的指针,但并不实现具体的方法,而是委派给 Implementor 类来实现。

RefinedAbstraction(扩充抽象)

扩充抽象是对抽象部分的具体实现。它实现了在抽象部分中定义的抽象方法,同时可以通过组合其他的类扩展自己的功能。

Implementor(实现部分)

实现部分是桥接模式中的实现类。它定义了一些基本的操作,但并不提供具体的实现。这些操作要交由 ConcreteImplementor 类来实现。

ConcreteImplementor(具体实现)

具体实现是实现部分的具体类。它对实现部分的操作进行了具体实现。

示例

下面是一个简单的示例,利用桥接模式实现不同颜色和形状的图形绘制:

// Implementor
interface Color {
    void applyColor();
}

// ConcreteImplementor
class Red implements Color {
    @Override
    public void applyColor() {
        System.out.println("red");
    }
}

class Blue implements Color {
    @Override
    public void applyColor() {
        System.out.println("blue");
    }
}

// Implementor
interface Shape {
    void draw();
}

// RefinedAbstraction
abstract class ShapeWithColor implements Shape {
    protected Color color;

    public ShapeWithColor(Color color) {
        this.color = color;
    }

    @Override
    public void draw() {
        color.applyColor();
        drawShape();
    }

    abstract void drawShape();
}

// ConcreteImplementor
class Circle extends ShapeWithColor {
    public Circle(Color color) {
        super(color);
    }

    @Override
    void drawShape() {
        System.out.println("draw a circle");
    }
}

class Square extends ShapeWithColor {
    public Square(Color color) {
        super(color);
    }

    @Override
    void drawShape() {
        System.out.println("draw a square");
    }
}

在上面的示例中,我们定义了两个 Implementor:Color 和 Shape,它们代表了颜色和图形的基本操作。我们还定义了两个 ConcreteImplementor:Red 和 Blue,分别代表了红色和蓝色。

在抽象部分中,我们定义了一个 ShapeWithColor 类,它基于 Shape 类型,同时需要一个 Color 类型的参数。它实现了 draw 方法,但具体的图形绘制操作 drawShape 需要由子类来实现。

最后,我们实现了两个扩充抽象:Circle 和 Square,它们代表了具体的图形。它们都继承了 ShapeWithColor 类型,因此可以在绘制图形时先绘制颜色。

下面是一个使用示例:

public static void main(String[] args) {
    Shape circle = new Circle(new Red());
    circle.draw();  // 输出 red draw a circle

    Shape square = new Square(new Blue());
    square.draw();  // 输出 blue draw a square
}

第一行代码创建了一个圆形,使用红色绘制。第二行代码创建了一个正方形,使用蓝色绘制。在执行 draw 方法时,输出了对应的颜色和图形类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java结构型模式之桥接模式详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Spring MVC文件请求处理MultipartResolver详解

    在 Spring MVC 中,MultipartResolver 是用于处理文件上传请求的组件。本文将详细讲解 Spring MVC 文件请求处理 MultipartResolver 的使用方法和注意事项。 MultipartResolver 的使用方法 在 Spring MVC 中,我们可以通过配置 MultipartResolver 来处理文件上传请求。…

    Java 2023年5月18日
    00
  • jsp中include指令静态导入和动态导入的区别详解

    JSP中include指令静态导入和动态导入的区别详解 在JSP中,我们可以使用include指令来包含其他的页面。include指令有两种导入方式:静态导入和动态导入。 静态导入 静态导入在JSP编译的时候就会被执行。即将被导入的页面会在编译期间被插入到包含该页面的页面中。因此,被导入的页面不能是动态生成的数据。下面是一个静态导入的示例: <%@ i…

    Java 2023年6月15日
    00
  • 2019年成功入职阿里:阿里的三套Java研发岗面试题总结

    “2019年成功入职阿里:阿里的三套Java研发岗面试题总结”攻略 背景 很多人梦想能够进入阿里巴巴这样的大公司,但是阿里的面试难度比较大,尤其是对于Java研发岗位的面试,更是要求很高。本文将总结出阿里Java研发岗最近几年出现的面试题及解答方法,希望大家能够有所收获。 面试题总结 阿里Java研发岗的面试题主要分为三套: 基础知识类 这套面试题主要考察面…

    Java 2023年5月19日
    00
  • springboot启动后卡住无日志的几种情况小结

    下面是关于“SpringBoot启动后卡住无日志的几种情况小结”完整攻略: 问题背景 在使用SpringBoot开发JavaWeb应用时,有时候可能会遇到启动后卡住无日志的情况,导致我们无法知道整个启动过程的具体信息。这种情况通常有以下几种原因: 应用启动卡在某个点,等待某个线程执行完成 应用启动时出现了未捕获的异常 应用启动时依赖的外部服务出现了故障 接下…

    Java 2023年6月2日
    00
  • java mybatis框架配置详解

    Java MyBatis框架配置详解 1. 简介 MyBatis是一个用Java编写的开源ORM(object relational mapping)框架。它通过XML或注解方式向数据库发送SQL语句,执行相应的操作,并将结果映射到Java对象中。 MyBatis具有以下优点: 灵活性较高,可以使用纯SQL,减少了ORM框架带来的性能压力。 可以进行批处理,…

    Java 2023年5月20日
    00
  • java web项目Session获取不到问题及解决

    我们来详细讲解一下“Java Web项目Session获取不到问题及解决”的攻略。 问题的描述 在 Java Web 项目中,我们经常使用 Session 来进行用户状态的维护和管理。但有时我们会发现,无法获取到已经创建的 Session,这样就会导致用户登录等功能出现问题。 问题的原因 造成 Session 获取失败的原因有很多,具体包括以下几个方面: 代…

    Java 2023年6月15日
    00
  • JavaSpringBoot报错“HttpMessageNotWritableException”的原因和处理方法

    原因 “HttpMessageNotWritableException” 错误通常是以下原因引起的: 响应体不正确:如果响应体不正确,则可能会出现此错误。在这种情况下,您需要检查响应体并确保它们正确。 响应体格式不正确:如果响应体格式不正确,则可能会出现此错误。在这种情况下,您需要检查响应体格式并确保它们正确。 解决办法 以下是解决 “HttpMessage…

    Java 2023年5月4日
    00
  • Java 自定义Spring框架与Spring IoC相关接口分析

    Java 自定义 Spring 框架与 Spring IoC 相关接口分析 什么是 Spring IoC Spring IoC 是 Spring 框架核心的实现,它通过使用依赖注入(Dependency Injection,DI)或反转控制(Inversion of Control,IoC)的方式管理类之间的关系,从而实现了松耦合、易测试、易维护的优秀设计,…

    Java 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部