Java桥梁设计模式优雅地将抽象与实现分离
作者:.番茄炒蛋 发布时间:2023-12-11 14:56:36
介绍
Java桥梁模式(也称桥接模式)(Bridge Pattern)是一种设计模式,它将抽象和实现分离,使它们可以独立地变化.它通过一个大类或者一系列紧密关联的类拆分成两个独立的层次结构来实现这种分离,其中一个层次结构包含抽象类或接口,另一个层次结构包含实现类.桥梁模式使得抽象类和实现类可以独立地变化,从而实现了松耦合.
在Java中,桥梁模式通常使用接口来定义抽象部分,使用抽象类来实现部分实现,并将它们通过组合的方式组合起来.抽象部分包含一个只想实现部分的引用,实现部分实现了抽象部分定义的接口.
Java桥梁模式分为以下四种角色:
抽象化角色(Abstraction):定义抽象化的接口,维护一个指向实现化对象的引用.
扩展抽象化角色(Refined Abstraction):扩展抽象化角色,通常是抽象化角色的子类,实现抽象化角色中的业务方法.
实现化角色(Implementor):定义实现化角色的接口,这个接口不一定要与抽象化角色的接口完全一致,事实上,这两个接口可以完全不同.
具体实现化角色(Concrete Implementor):具体实现化角色实现实现化角色接口,并完成具体的业务逻辑.
实现
例如,在电商网站中,可能需要支持多种支持方式,如支付宝,微信支付和银联支付等.使用桥梁模式可以轻松地添加或切换不同的支付方式,以满足用户的需求.
实现化角色
public interface PaymentImplementor {
/**
* 支付
*
* @param amount
*/
void processPayment(double amount);
}
具体实现化角色
public class AliPaymentImplementor implements PaymentImplementor {
/**
* 支付
*
* @param amount
*/
@Override
public void processPayment(double amount) {
System.out.println("支付宝支付:" + amount + "元...");
}
}
public class WechatPaymentImplementor implements PaymentImplementor {
/**
* 支付
*
* @param amount
*/
@Override
public void processPayment(double amount) {
System.out.println("微信支付:" + amount + "元...");
}
}
public class UnionpayPaymentImplementor implements PaymentImplementor {
/**
* 支付
*
* @param amount
*/
@Override
public void processPayment(double amount) {
System.out.println("银联支付:" + amount + "元...");
}
}
抽象化角色
public abstract class Payment {
protected PaymentImplementor implementor;
public Payment(PaymentImplementor implementor) {
this.implementor = implementor;
}
/**
* 支付
*
* @param amount
*/
public abstract void pay(double amount);
}
扩展化抽象角色
public class OnlinePayment extends Payment{
public OnlinePayment(PaymentImplementor implementor) {
super(implementor);
}
/**
* 支付
*
* @param amount
*/
@Override
public void pay(double amount) {
System.out.println("开始在线支付...");
implementor.processPayment(amount);
System.out.println("在线支付完成...");
}
}
测试
public class Demo {
public static void main(String[] args) {
// 支付宝支付
PaymentImplementor paymentImplementor = new AliPaymentImplementor();
Payment payment = new OnlinePayment(paymentImplementor);
payment.pay(100);
System.out.println();
// 微信支付
paymentImplementor = new WechatPaymentImplementor();
payment = new OnlinePayment(paymentImplementor);
payment.pay(101);
System.out.println();
// 银联支付
paymentImplementor = new UnionpayPaymentImplementor();
payment = new OnlinePayment(paymentImplementor);
payment.pay(102);
}
}
这段代码是一个简单的实现了桥梁模式的示例.其中,Payment是抽象类,OnlinePayment是其子类,PaymentImplementor是接口,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor都是其实现类.通过这种方式,Payment类PayImplementor接口被解耦,可以独立地发展和扩展.
在这个示例中,Payment类是抽象化,不能被实例化,而是通过OnlinePayment子类进行实例化.OnlinePayment子类重写了pay方法,并调用implementor.processPayment方法,该方法由实现PaymentImplementor接口的类来是心啊,例如,AliPaymentImplementor,UnionpayPaymentImplementor和WechatPaymentImplementor.这种方式使得PaymentImplementor接口的实现类可以动态地注入到OnlinePayment类中,从而实现了不同的支付方式,而不需要修改OnlinePayment类.
总结
优点
分离抽象和实现部分,使得它们可以独立变化,从而增加了系统的灵活性和可扩展性.
通过抽象接口来管理对象之间的关系,更加符合面向对象编程的原则,使得系统更加易于维护和理解.
桥梁模式可以避免使用继承造成的类 * 问题,因为它似乎用了组合关系.
缺点
桥梁模式增加了系统的复杂性,需要额外的抽象层,可能会导致系统的设计变得复杂.
如果不恰当地设计桥梁接口和实现类,可能会导致系统的耦合度增加.
应用场景
当一个类具有多个变化维度(例如,一个形状类有不同的颜色和尺寸)时,可以使用桥梁模式来将它们分离开来,从而使得系统更加灵活.
当需要支持不同平台,数据库或协议时,可以使用桥梁模式来封装这些实现细节,使得客户端和实现部分可以独立变化,而不影响彼此.
当需要运行时动态地切换实现时,可以使用桥梁模式来实现这种切换.
来源:https://blog.csdn.net/qq_43135259/article/details/129710033


猜你喜欢
- Maven打包时指定启动类使用Maven打包的时候, 有时候需要指定启动类, 可如下操作!测试项目(结构如下):代码: com.xxx.Ma
- 本文实例为大家分享了java实现字符串反转的具体代码,供大家参考,具体内容如下1.需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调
- 废话不多说,直接上代码package com.ncu.list;/** * * 顺序结构线性列表 *&nbs
- 今日遇到一个问题:springboot需要获取到一个自定义名称文件夹下的静态资源(图片等),并且文件夹的路径不在classPath下面,而是
- 本文实例讲述了Android编程实现为ListView创建上下文菜单(ContextMenu)的方法。分享给大家供大家参考,具体如下:Con
- 现在很多应用都会用到悬浮窗,很多国产rom把悬浮窗权限加入控制了,你就需要判断是否有悬浮窗权限,然后做对应操作。Android 原生有自带权
- 1、官网概括引用官网说法:The Java Virtual Machine defines various run-time data ar
- 上一节初步了解了Android端的贝塞尔曲线,这一节就举个栗子练习一下,仿QQ未读消息气泡,是最经典的练习贝塞尔曲线的东东,效果如下附上gi
- 3.3 do...while()循环3.3.1 do语句的语法:do
- 匿名类类型类可以是匿名的 - 也就是说,可以在没有 identifier 的情况下声明类。在将类名称替换为 typedef 名称时,这会很有
- Java微信跳一跳操作指南,指哪挑哪。本文的思路是通过adb来控制手机进行操作,通过java写一个jframe覆盖在手机屏幕上,用鼠标获取跳
- 本文实例为大家分享了javafx实现时钟效果的具体代码,供大家参考,具体内容如下核心为三个函数:第一个为 public void dials
- 背景系统: SpringBoot开发的Web应用;ORM: JPA(Hibernate)接口功能简述: 根据实体类ID到数据库中查询实体信息
- 本文实例讲述了C#常用目录文件操作类。分享给大家供大家参考。具体分析如下:这个c#类封装了常用的目录操作,包括列出目录下的文件、检测目录是否
- JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步
- 前言Java8 由Oracle在2014年发布,是继Java5之后最具革命性的版本。Java8吸收其他语言的精髓带来了函数式编程,lambd
- 数据传输在Android开发过程中,我们常常通过Intent在各个组件之间传递数据。例如在使用startActivity(android.c
- Spring2.5.6开发环境搭建的过程,供大家参考,具体内容如下1、jar 包准备:spring 2.5.6 的 jar 包(链接: ht
- 标识符Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符技巧:凡是自己可以起名字的地方都叫标识符定义合法标识符规则:由26个
- springboot静态资源加载顺序优先级看springboot源码里面springboot静态资源加载规则我们经常会使用springboo