Java结构型设计模式之桥接模式详细讲解
作者:丨Jack_Chen丨 发布时间:2023-08-26 16:25:56
桥接模式
概述
桥接模式(Bridge Pattern)也称为桥梁模式、接口(Interfce)模式或柄体(Handle and Body)模式,属于结构型模式。
它是将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。
桥接模式主要目的是通过组合的方式建立两个类之间的联系,而不是继承。桥接模式的核心在于解耦抽象和实现。
应用场景
当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构隐定。
适用业务场景:
1.在抽象和具体实现之间需要增加更多的灵活性的场景。
2.一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。
3.不希望使用继承,或因为多层继承导致系统类的个数剧增。
优缺点
优点:
1.分离抽象部分及其具体实现部分
2.提高了系统的扩展性
3.实现细节对客户透明
缺点:
1.增加了系统的理解与设计难度
2.需要正确地识别系统中两个独立变化的维度
主要角色
1.抽象(Abstraction)
该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象)。
2.修正抽象(RefinedAbstraction)
抽象的具体实现,对抽象的方法进行完善和扩展。
3.实现(Implementor)
确定实现维度的基本操作,提供给抽象使用。该类一般为接口或抽象类。
1.具体实现(Concretelmplementor)
实现的具体实现。
桥接模式的基本使用
创建实现角色
public interface IImplementor {
void operationImpl();
}
创建具体实现角色
public class ConcreteImplementorA implements IImplementor {
public void operationImpl() {
System.out.println("ConcreteImplementorA operationImpl");
}
}
public class ConcreteImplementorB implements IImplementor {
public void operationImpl() {
System.out.println("ConcreteImplementorB operationImpl");
}
}
创建抽象角色
public abstract class Abstraction {
protected IImplementor mImplementor;
public Abstraction(IImplementor implementor) {
this.mImplementor = implementor;
}
public void operation() {
this.mImplementor.operationImpl();
}
}
创建修正抽象角色
public class RefinedAbstraction extends Abstraction {
public RefinedAbstraction(IImplementor implementor) {
super(implementor);
}
@Override
public void operation() {
super.operation();
System.out.println("RefinedAbstraction operation");
}
}
客户端调用
public static void main(String[] args) {
// 来一个实现化角色
IImplementor impA = new ConcreteImplementorA();
IImplementor impB = new ConcreteImplementorB();
// 来一个抽象化角色,聚合实现
Abstraction absA = new RefinedAbstraction(impA);
Abstraction absB = new RefinedAbstraction(impB);
// 执行操作
absA.operation();
absB.operation();
}
ConcreteImplementorA operationImpl
RefinedAbstraction operation
ConcreteImplementorB operationImpl
RefinedAbstraction operation
桥接模式实现消息发送
使用桥接模式解耦消息类型与消息重要程度。
创建实现角色
创建实现角色,担任桥接角色,实现消息发送的统一接口
public interface IMessage {
void send(String message);
}
创建具体实现角色
public class EmailMessage implements IMessage {
@Override
public void send(String message) {
System.out.println("使用邮件消息发送" + message);
}
}
public class SmsMessage implements IMessage {
@Override
public void send(String message) {
System.out.println("使用短信消息发送" + message);
}
}
创建抽象角色
创建抽象角色,担任桥接抽象角色,持有实现角色,且发送消息委派给实现对象发送
public abstract class AbastractMessage {
// 持有实现角色的引用
private IMessage message;
// 构造函数,传入实现角色的引用
public AbastractMessage(IMessage message) {
this.message = message;
}
// 发送消息的方法,调用实现角色的方法
void sendMessage(String message){
this.message.send(message);
}
}
创建修正抽象角色
创建普通消息
public class NomalMessage extends AbastractMessage {
public NomalMessage(IMessage message) {
super(message);
}
}
创建重要消息
public class ImportanceMessage extends AbastractMessage {
public ImportanceMessage(IMessage message) {
message = message + "【重要消息】";
super(message);
}
void sendMessage(String message){
super.sendMessage(message);
}
}
客户端调用
public static void main(String[] args) {
IMessage message = new EmailMessage();
AbastractMessage abastractMessage = new NomalMessage(message);
abastractMessage.sendMessage("hello world");
message = new SmsMessage();
abastractMessage = new ImportanceMessage(message);
abastractMessage.sendMessage("hello world");
}
使用邮件消息发送hello world
使用短信消息发送hello world【重要消息】
来源:https://blog.csdn.net/qq_38628046/article/details/126194229


猜你喜欢
- 本文实例讲述了Android开发实现查询远程服务器的工具类QueryUtils。分享给大家供大家参考,具体如下:/** * 查询远程服务器的
- IDEA单元测试报错:Class not found:xxxx springboot报错引入了新依赖,想着在测试模块进行测试。结果报错说Cl
- 简介Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exc
- 本文实例讲述了Java Web开发之基于Session的购物商店实现方法。分享给大家供大家参考,具体如下:package cn.com.sh
- 这篇文章主要介绍了Java多线程状态及方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 什么是代理模式代理模式是开发中常见的一种设计模式,使用代理模式可以很好的对程序进行横向扩展。代理,顾名思义就是一个真实对象会存在一个代理对象
- 一 前言此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全
- 使用Scroller实现绚丽的ListView左右滑动删除Item效果这里来给大家带来使用Scroller的小例子,同时也能用来帮助初步解除
- public/protected/privatepublic表示公开,private表示私有,protected表示保护,什么都不写表示默认
- 创蓝253: https://www.253.com/#region 获取手机验证码(创蓝253) /// <summar
- C#事件实例详解C#和JAVA有许多相似的地方,设计思想差不多,语法及其相像,均传承自面向对象设计思想,灵感来自C++并取其精华去其“糟粕(
- Java中使用也比较简单:1. 编译正则表达式的字面值得到对应的模式Pattern对象;2. 创建匹配给定输入与此模式的匹配器Matcher
- 一、文件的编码package com.study.io;/*** 测试文件编码*/public class EncodeDemo {/***
- 话不多说,直接上实例:一、获取集合内重复值public void GetDuplicateValue(){ List<st
- 代码:package com.lwj.test.proxy;import java.lang.reflect.InvocationHandl
- 一、前言让我们先理一下springfox与swagger的关系。swagger是一个流行的API开发框架,这个框架以“开放API声明”(Op
- C#在程序中定义和使用自定义事件可以分为以下几个步骤:步骤1:在类中定义事件using System;public class TestCl
- 1,背景在开发中总会遇到一个可拖拽的悬浮View,不管是在开发中,还是在线上,都时长有这样的控件,我们通常遇到这种情况,经常需要自己封装,需
- 本文实例讲述了Java swing框架实现的贪吃蛇游戏。分享给大家供大家参考,具体如下:java是门高级语言,做游戏时适合做后台,但是用它也
- 如下所示:String.valueOf((char)10)在导出excel 的时候,如果原始文字中含有 \n 字符, 如果把 \n 替换为&