Java设计模式之结构型-桥接模式(UML类图+案例分析)

news2024/11/28 12:43:34

目录

一、基础概念

二、UML类图

三、角色分析

四、案例分析

1、支付方式

2、支付渠道 

五、总结


一、基础概念

桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是“将抽象部分与实现部分分离,使它们都可以独立地变化”。

桥接模式的核心思想是把抽象(abstraction)与实现(implementation)分离开来,从而可以独立变化。

抽象类定义抽象接口,包含对实现对象的引用。

实现类提供各种实现方案,抽象接口调用实现对象的相关方法完成工作。

这样抽象部分和实现部分就可以通过抽象层建立联系,相互独立地变化而不影响对方。

二、UML类图

三、角色分析

角色描述
抽象类(Abstraction)定义抽象类,并包含一个对实现类对象的引用。例如:支付渠道抽象类。
扩展抽象类(Refined Abstraction)扩展该抽象类,改变和修饰该抽象类的接口。例如:微信支付渠道和支付支付渠道的扩展抽象类。
实现类接口(Implementor)定义实现类接口,供扩展抽象类调用。例如:支付方式接口。
具体实现类(Concrete Implementor)实现类接口的具体实现。例如:密码支付、指纹支付和人脸支付的具体实现。

四、案例分析

在日常生活中不管用什么渠道进行支付,例如支付宝、微信支付和云闪付等,它们都提供了三种支付方式,分别是密码支付、指纹支付和人脸支付,下面就通过代码来实现这个例子让大家更容易去理解这个设计模式。

1、支付方式

定义支付方式的接口:

package mode;

public interface PayMode {

    void mode();

}

密码支付实现类: 

package mode;

public class PwdPayMode implements PayMode {

    @Override
    public void mode() {
        System.out.println("密码支付");
    }
}

指纹支付实现类:

package mode;

public class FingerPayMode implements PayMode{
    @Override
    public void mode() {
        System.out.println("指纹支付");
    }
}

人脸支付实现类:

package mode;

public class FacePayMode implements PayMode {

    @Override
    public void mode() {
        System.out.println("人脸支付");
    }
}

2、支付渠道 

定义支付渠道的抽象类:

package channel;

import mode.PayMode;

public abstract class PayAbstract {

    protected PayMode payMode;

    public PayAbstract(PayMode payMode) {
        this.payMode = payMode;
    }

    public abstract void transfer();

}

支付渠道抽象类子类-支付宝:

package channel;

import mode.PayMode;

public class ZfbPay extends PayAbstract {

    public ZfbPay(PayMode payMode) {
        super(payMode);
    }

    @Override
    public void transfer() {
        System.out.println("支付宝渠道");
        this.payMode.mode();
    }

}

支付渠道抽象类子类-微信:

package channel;

import mode.PayMode;

public class WxPay extends PayAbstract {

    public WxPay(PayMode payMode) {
        super(payMode);
    }

    @Override
    public void transfer() {
        System.out.println("微信渠道");
        this.payMode.mode();
    }

}

以上就把整体的代码核心逻辑都撰写完毕了,接下来我们运行写个主方法测试一下,代码示例如下:

public class Main {

    public static void main(String[] args) {
        PayAbstract wxPay = new WxPay(new PwdPayMode());
        wxPay.transfer();

        PayAbstract wxPay2 = new WxPay(new FingerPayMode());
        wxPay2.transfer();

        PayAbstract wxPay3 = new WxPay(new FacePayMode());
        wxPay3.transfer();

        PayAbstract zfbPay = new ZfbPay(new PwdPayMode());
        zfbPay.transfer();

        PayAbstract zfbPay2 = new ZfbPay(new FingerPayMode());
        zfbPay2.transfer();

        PayAbstract zfbPay3 = new ZfbPay(new FacePayMode());
        zfbPay3.transfer();

    }
}

运行结果如下:

五、总结

优点:

1、抽象和实现分离,提高了扩展性,符合开闭原则。

2、实现细节对客户透明,可以对客户端隐藏变化。

3、符合组合复用原则,不使用继承提高复用性。

缺点:

增加了系统的复杂性。

应用场景:

1、一个抽象有多种实现需要动态切换时。

2、系统需要在多个平台上运行时。

3、一个抽象有多个变化维度需要独立扩展。

符合的原则:

1、单一职责原则(Single Responsibility Principle

桥接模式实现了抽象部分和实现部分的分离,使它们各自只需要关注一个单一的职责。

2、开闭原则(Open Closed Principle

桥接模式使抽象部分和实现部分可以独立扩展开放,而不需要修改对方的代码。

3、组合复用原则(Composite Reuse Principle

桥接模式充分利用了组合和聚合关系增加系统的复用性。

4、里氏替换原则(Liskov Substitution Principle

抽象部分针对接口编程,其引用实现类对象可以替换为其子类,继续运行。

5、依赖倒转原则(Dependency Inversion Principle

抽象部分和实现部分通过接口联系,实现了面向接口编程隔离了依赖关系。

总的来说桥接模式通过抽象和实现分离,实现解耦,让它们可以独立变化,从而保持高扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/741911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序扫码邀请,小程序码生成带参数

代码一: public String generateQRCode(String appId, String appSecret, String pagePath) throws IOException {String accessToken getAccessToken(appId, appSecret);String apiUrl "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token&qu…

springboot家乡特色推荐系统

本次设计任务是要设计一个家乡特色推荐系统,通过这个系统能够满足家乡特色文章的管理功能。系统的主要功能包括首页,个人中心,用户管理,文章分类管理,文章分享管理,系统管理等。 管理员可以根据系统给定的账…

前端工程化与webpack

一、目标 能够说出什么是前端工程化能够说出webpack的作用能够掌握webpack的基本使用了解常用plugin的基本使用了解常用loader的基本使用能够说出Source Map的作用 二、目录 前端工程化webpack的基本使用webpack中的插件webpack中的loader打包发布Source Map 1.前端工程化 …

2023年Q2京东冰箱行业品牌销售排行榜(京东销售数据分析)

近年我国的冰箱零售呈波动变化的趋势,由于冰箱市场趋于饱和,因此消费者对冰箱的需求逐渐变为替换需求,这也进一步推动了产品的更新迭代。接下来结合具体数据,我们来分析一下2023年Q2冰箱行业的销售详情。 根据鲸参谋电商数据分析平…

MySQL环境配置

MySQL在centos7环境安装 一.卸载不要的环境二.获取mysql官方yum源三.安装mysql服务四.mysql登陆五.设置配置文件my.cnf六.设置开机启动【可以不设】七.常见问题 安装与卸载中,⽤⼾全部切换成为root,⼀旦安装,普通⽤⼾也能使⽤。 一.卸载不要…

Python编程——字符串的三种定义方式讲解

作者:Insist-- 个人主页:insist--个人主页 本文专栏:python专栏 专栏介绍:本专栏为免费专栏,并且会持续更新python基础知识,欢迎各位订阅关注。 前言 上篇文章讲了python字符串的一些知识,现在…

[ICASSP 2019] 差分隐私压缩 K 均值

Differentially Private Compressive K-means Differentially Private Compressive K-means | IEEE Conference Publication | IEEE Xplore 摘要: 这项工作解决了从大量数据中学习并保证隐私的问题。概述的学习框架建议通过将大规模数据集压缩为广义随机矩的单个向…

Arduino为GD32芯片编程

GD32F103用Arduino编程 板子线路图Ardunino编程程序编制编译下载 板子线路图 这个STM32F103C8T6用国产的GD32来代替。 Ardunino编程 使用Arduino编程,在板子管理器中安装: 安装需要一些时间,在这里可以看到,STM32F1xx支持GD32F…

Flink-intervalJoin源码和并行度问题

1.源码 底层用的是connect 把两个流的数据先保存到状态中 先判断有没有迟到,迟到就放到侧输出流 再根据范围找数据 然后根据上界删除数据 package com.atguigu.gmall.realtime.test;import org.apache.flink.api.common.eventtime.SerializableTimestampAssigne…

【Java基础教程】(十一)面向对象篇 · 第五讲:透彻讲解Java中的static关键字及代码块——静态属性、静态方法和普通代码块、构造块、静态块的使用~

Java基础教程之面向对象 第五讲 本节学习目标1️⃣ static 关键字1.1 static定义静态属性1.2 static定义静态方法1.3 主方法1.4 实际应用功能一:实现类实例化对象个数的统计功能二: 实现属性的自动设置 2️⃣ 代码块2.1 普通代码块2.2 构造块2.3 静态块…

gulimall-首页渲染-nginx域名搭建

首页渲染与nginx域名搭建 前言一、首页1.1 整合 thymeleaf1.2 整合 dev-tools1.3 渲染分类数据 二、Nginx 域名搭建2.1 搭建域名访问环境2.2 nginx 配置文件2.3 总结 前言 本文继续记录B站谷粒商城项目视频 P136-140 的内容,做到知识点的梳理和总结的作用。 一、首…

组合取球-2022年全国青少年信息素养大赛Python国赛第6题

[导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛真题系列的第8讲。 全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计…

教你如何自定义 Github 首页

一、创建自定义首页仓库 若要自定义首页,首先需要创建一个与你 Github ID 同名的仓库 创建完成后就可以开始为你的首页添加一些有趣的内容了,代码格式可以是 markdown 语法,也可以是 HTML 语法,但 HTML 的扩展性更强一点&#xf…

大唐京兆韦氏,两个老来发奋的诗人

在唐朝,诗人文学政治家如过江之鲫,有两个人物是绝对不可忽略的,那就是韦应物和韦庄。其中韦应物是韦庄的曾祖父。 京兆韦氏是整个唐朝时期最重要的士族家族之一,代有人才出,衣冠鼎盛,为关中望姓之首。韦氏…

I/O多复用函数(select、poll、epoll)

目录 一、select函数二、poll函数 select函数 int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);poll函数 int poll(struct pollfd *fds, nfds_t nfds, int timeout);epoll API epoll_create epoll_wait epoll_ctl一、sel…

Spring Boot 系列3 -- 日志文件

目录 1. 日志有什么用? 2. 日志的使用 2.1 得到日志对象 2.2 使用日志对象打印日志 3. 日志级别 3.1 日志级别的用途 3.2 日志级别的分类和使用 3.3 日志的打印规则 3.4 日志级别的设置 4. 日志持久化 5. 更简单的日志输出--lombok 6. 拓展1 lombok的原理 7. 拓…

SSM整合-1

SSM整合 创建工程SSM整合 2.1 Spring: SpringConfig 2.2 SpringMvc: ServletConfig、SpringMvcConfig 3.3 Mybatis JdbcConfig、MybatisConfig、jdbc.properties 3.功能模块 表与实体类 dao(接口自动代理) service(接口实现类) 业务层接口测试(整合Junit&#xff…

在vite创建的vue3项目中使用Cesium加载立体地形信息并调整初始化角度

在vite创建的vue3项目中使用Cesium加载立体地形信息并调整初始化角度 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium vite -D配置 (1)在项目的vite.config.js文件中添加&am…

新手学习编程有什么注意事项?

为什么要学习如何编码? 世界正在成为一个地球村。编码是它发生的一个重要原因。 你应该学习如何编码的原因有很多,我将在这里触及其中的一些。 首先,学习编码可以大大提高你的分析和解决问题的能力。 您的收入潜力增加:有高级开…

NTIRE2023 图像复原和增强赛事Efficient Super-Resolution赛道冠军方案解读——DIPNet

DIPNet: Efficiency Distillation and Iterative Pruning for Image Super-Resolution 0. 简介 NTIRE 的全称为New Trends in Image Restoration and Enhancement Challenges,即“图像复原和增强挑战中的新趋势”,是CVPR(IEEE Conference on Computer V…