设计模式之桥接模式

macOS 12.7.6部署Ollama+Dify避坑指南 本文介绍了在macOS 12.7.6系统下部署Ollama和Dify的详细步骤及避坑指南。主要内容包括:1)关闭系统完整性保护(SIP)以允许修改系统目录;2)安装特定版本的Docker(2.1.0.5)和docker-compose(v2.38.2)以避免兼容性问题;3)配置Ollama服务并下载nomic-embed-text和deepseek-r1:7b模型;4)针对macOS调整Dify的docker配置文件,包括延长超时时间、修改存储路径、增加资源限制等关键设置。文中提供了完整的命令操作步骤和配置 阅读详情

什么是桥接模式

    桥接模式是将他的抽象部分与实现部分分离,使他们都可以独立地变化。
    桥接模式包含以下几个角色:
        Abstraction(抽象类):用于定义抽象类,一般是抽象类不是接口,该类中定义了一个实现类接口类型的对象并可以维护该对象,并且与实现类接口有关联关系,该抽象类即可以包含抽象业务方法,也可以包含具体业务方法。
        RefinedAbstraction(扩展抽象类):扩展由Abstraction定义的接口,通常情况下为具体类,实现了在Abstraction中声明的抽象业务方法,在RefinedAbstraction中可以调用在实现类中定义的业务方法。
        Implementor(实现类接口):这个接口不一定与Abstraction的接口完全一致,实际上可以完全不同。一般实现类接口只提供基本操作,而Abstraction则会做更多复杂的操作。实现类接口对这些基本操作进行了声明,而具体实现交给其子类。通过关联关系,在Abstraction中不仅有自己定义的方法,还可以通过关联关系调用实现类中定义的方法,使用关联关系来代替继承关系。
        ConcreteImplementor(具体实现类):在不同的具体实现类中提供基本操作的不同实现。
    桥接模式中体现了很多面向对象的设计原则思想,包括单一职责原则,开闭原则,合成复用原则,里氏替换原则,依赖倒转原则等。

桥接模式的优缺点

优点
  1. 分离抽象类及其实现部分。桥接模式使用对象间的关联关系解耦了抽象和现实之间固有的绑定关系,使得抽象和实现可以沿着各自的维度变化。
  2. 桥接模式可以取代多层继承方案,多层继承方案违背了单一职责原则,复用性较差,且类的个数非常多。
  3. 提供了系统的扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则。
缺点
  1. 桥接模式的使用增加了系统的理解和设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行编程。
  2. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。

桥接模式的应用场景

  1. 如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使他们在抽象层建立一个关联关系。
  2. 抽象部分和实现部分可以以继承的方式独立扩展而不相互影响。
  3. 一个类存在多个独立变化的维度,且多个维度都要独立进行扩展。

桥接模式的案例

// 抽象类
public abstract class Phone {

    /**
     * 组合品牌
     */
    private Brand brand;

    public Phone(Brand brand) {
        super();
        this.brand = brand;
    }

    protected void open() {
        this.brand.open();
    }

    protected void close() {
        brand.close();
    }

    protected void call() {
        brand.call();
    }

}

// 抽象扩展类
public class FoldedPhone extends Phone {

	public FoldedPhone(Brand brand) {
		super(brand);
	}

	@Override
	public void open() {
		super.open();
		System.out.println(" 折叠样式手机 ");
	}

	@Override
	public void close() {
		super.close();
		System.out.println(" 折叠样式手机 ");
	}

	@Override
	public void call() {
		super.call();
		System.out.println(" 折叠样式手机 ");
	}
}

// 实现类接口
public interface Brand {

    void open();

    void close();

    void call();

}

// 具体实现类
public class Vivo implements Brand {

	@Override
	public void open() {
		System.out.println(" Vivo手机开机 ");
	}

	@Override
	public void close() {
		System.out.println(" Vivo手机关机 ");
	}

	@Override
	public void call() {
		System.out.println(" Vivo手机打电话 ");
	}

}

public class XiaoMi implements Brand {

    @Override
    public void open() {
        System.out.println(" 小米手机开机 ");
    }

    @Override
    public void close() {
        System.out.println(" 小米手机关机 ");
    }

    @Override
    public void call() {
        System.out.println(" 小米手机打电话 ");
    }

}


public static void main(String[] args) {
    //获取折叠式手机 (样式 + 品牌 )
    Phone phone1 = new FoldedPhone(new XiaoMi());
    phone1.open();
    phone1.call();
    phone1.close();

    Phone phone2 = new FoldedPhone(new Vivo());
    phone2.open();
    phone2.call();
    phone2.close();
}

在这里插入图片描述

桥接模式在源码中的应用

Handler
// 抽象类
public abstract class Handler {
    private static final int offValue = Level.OFF.intValue();
    private final LogManager manager = LogManager.getLogManager();

    // We're using volatile here to avoid synchronizing getters, which
    // would prevent other threads from calling isLoggable()
    // while publish() is executing.
    // On the other hand, setters will be synchronized to exclude concurrent
    // execution with more complex methods, such as StreamHandler.publish().
    // We wouldn't want 'level' to be changed by another thread in the middle
    // of the execution of a 'publish' call.
    private volatile Filter filter;
    private volatile Formatter formatter;
    private volatile Level logLevel = Level.ALL;

    public synchronized void setFormatter(Formatter newFormatter) throws SecurityException {
        checkPermission();
        // Check for a null pointer:
        newFormatter.getClass();
        formatter = newFormatter;
    }
    ......  
}

// 实现类接口
public abstract class Formatter {

    /**
     * Construct a new formatter.
     */
    protected Formatter() {
    }

    /**
     * Format the given log record and return the formatted string.
     * <p>
     * The resulting formatted String will normally include a
     * localized and formatted version of the LogRecord's message field.
     * It is recommended to use the {@link Formatter#formatMessage}
     * convenience method to localize and format the message field.
     *
     * @param record the log record to be formatted.
     * @return the formatted log record
     */
    public abstract String format(LogRecord record);
    ......
}


// 具体实现类
public class SimpleFormatter extends Formatter {

    // format string for printing the log record
    private static final String format = LoggingSupport.getSimpleFormat();
    private final Date dat = new Date();
    
    public synchronized String format(LogRecord record) {
        dat.setTime(record.getMillis());
        String source;
        if (record.getSourceClassName() != null) {
            source = record.getSourceClassName();
            if (record.getSourceMethodName() != null) {
               source += " " + record.getSourceMethodName();
            }
        } else {
            source = record.getLoggerName();
        }
        String message = formatMessage(record);
        String throwable = "";
        if (record.getThrown() != null) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            pw.println();
            record.getThrown().printStackTrace(pw);
            pw.close();
            throwable = sw.toString();
        }
        return String.format(format,
                             dat,
                             source,
                             record.getLoggerName(),
                             record.getLevel().getLocalizedLevelName(),
                             message,
                             throwable);
    }
    ......
}


RK3568平台开发系列讲解(项目篇)手写数字识别 📢 本篇章带大家基于飞桨(PaddlePaddle),完成一个简单的手写数字识别任务。 阅读详情

相关推荐

Python爬虫实战:5分钟搞定东方财富网股票数据抓取(附完整代码)

本文详细介绍了如何利用Python爬虫技术,快速抓取东方财富网的实时股票数据。通过逆向分析其JSONP数据接口,构建了包含请求处理、数据清洗、分页调度及多格式存储的完整自动化采集系统,并提供了应对反爬策略与生产部署的进阶优化思路,附有可直接运行的完整代码。

weixin_29084231的博客 874

桥接模式

简介 桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。 桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象...

genmenu的博客 306

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

syqenter的专栏 8961

【设计模式从入门到精通】06-桥接模式

桥接模式 1、传统方式解决手机操作问题 2、桥接模式基本介绍 3、桥接模式解决手机操作问题 4、JDK 源码分析 5、注意事项和细节 6、桥接模式其他应用场景

VectorX's Blog 756

RTC 实时时钟实验

如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个TR_CLK 周期中 RTC 产生一个中断(秒中断)。void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data) // 往备份区域写用户数据的函数 (这个函数的第一个参数就是寄存器的标号了,这个是通过宏定义定义的)存储在 RTC_ALR 寄存器中的可编程时间相比较,如果 RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。寄存器操作完成,并同步之后,设置秒钟中断。

m0_55996456的博客 1205

旋转矩阵推导

推导前提: 坐标使用右手坐标系,角度逆时针旋转为正。 绕X轴旋转角度为 俯仰角 即Pitch 绕Y轴旋转角度为 偏航角 即Yaw(Head) 绕Z轴旋转角度为 翻滚角 即Roll 一、平面二维坐标点的旋转 如右图所示,根据三角函数关系,可以列出向量OP与OP’的坐标表示形式: x = |OP|•cosα x′ = |OP|•cos(α+β) y = |OP|•sinα y′ = |OP|•sin(α+β) 将P′(x′,y′)表达式展开: x′ =

suixinger_lmh的随笔 1384

设计模式之桥接模式(8)

设计模式之桥接模式,使用场景、优缺点及需求案例。

Cami_xiao的博客 490

箱式连续提升机

箱式连续提升机,是对具有高度差较大(>1500mm)的输送线之间进行连接,将箱式物资进行连续输送的提升(或下降)的输送设备,可根据输送线的具体输送要求作相应的参数设计。目前的箱式连续提升机种类比较多,常用的形式主要有Z型和C型,工作原理相同,只是入口和出口分别在两侧和同侧。

月生沧溟 1248

处理多维度变化——桥接模式

2 桥接模式概述 桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。 桥接模式用一种巧妙的方式处理多层继

lynchyo——得失只在刹那间 1597

关于红队方面的学习资料

关于红队方面的学习资料

Sumarua的博客 1084

新系统申请软件著作权详细操作说明

今年八月底版权中心系统升级,新系统相对好用一些,至少不用再拿IE访问了,但是多了一项实名认证。下面介绍新系统的操作流程。 目录注册、登录和实名认证注册登录实名认证软件登记申请申请表填写鉴别材料身份证明文件权利归属证明文件其他材料提交材料变更登记 注册、登录和实名认证 首先访问版权中心系统:https://register.ccopyright.com.cn/login.html,如果老系统有账号直接登录即可,没有的话需要注册。 注册 点击注册按钮进入注册。 根据实际情况选择个人或单位,每个个人或单位只能在

Programming Talk 1万+

设计模式-桥接模式-bridge pattern

桥接模式(Bridge Pattern)是一种结构性设计模式,用于将抽象部分与其实现部分分离,使它们可以独立地变化。这种模式通过定义一个桥接接口,将实现的类和抽象的类解耦,从而能够独立地扩展抽象类和实现类。抽象(Abstraction):扩展抽象(Refined Abstraction):实现化(Implementor):具体实现化(Concrete Implementor):首先,定义实现化接口: 接着,创建具体的实现化类: 然后,定义抽象类: 接着,扩展抽象类: 最后,客户端代码使用桥接模式: 1.3.

wesigj的博客 2823

YOLOv10改进策略【注意力机制篇】| 2024 蒙特卡罗注意力(MCAttn)模块,提高小目标的关注度

本文记录的是基于蒙特卡罗注意力(MCAttn)模块的YOLOv10目标检测改进方法研究。利用提高的跨尺度特征提取能力,使模型能够更好地传递和融合提取的多尺度特征,提高对小目标的关注度。Exploiting Scale-Variant Attention for Segmenting Small Medical Objects使用一种基于随机采样的池化操作来生成尺度无关的注意力图。它从三个不同尺度(3×33×33×3、2×22×22×2和1×11×11×1,即池化张量)中随机选择一个1×11×11×1注意力图

Limiiiing的博客 2186

设计模式之桥接模式(Bridge Design Pattern)

桥接模式(Bridge Design Pattern),也叫作桥梁模式。在 GoF 的《设计模式》一书中,桥接模式是这么定义的:“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化”。 桥梁模式从名字来看很具象,但从定义来看又很抽象难懂。对于初学设计模式,桥梁最难理解的一种模式之一。 本文我们从一个飞机的例子慢慢演化,来理解桥

xjj1314的专栏 760

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

设计模式之桥接模式BridgePattern(十二)

桥接模式(bridge pattern) 的定义是:将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的静态继承关系转变为动态的组合关系,使得系统更加灵活,并易于扩展,有效的控制了系统中类的个数 (避免了继承层次的指数级爆炸)。

徐泗空的博客 836

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

设计模式桥接模式(BridgePattern)

核心模块:Abstracttion抽象类、RefinedAbstraction扩充抽象类、Implementor实现类接口、ConcreteImplementor具体实现类 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:多维度耦合的情况,不希望用继承的情况; 优点:减少了类的数量和和代码量,避免

didiao11300的专栏 298

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

23种设计模式——桥接模式 (Bridge Pattern)详解

本文介绍了23种经典设计模式之——桥接模式(Bridge Pattern)的使用及说明

Meteors.的博客 1224

设计模式之桥接模式BridgePattern

设计模式之桥接模式BridgePattern 代码下载 BridgePattern 1.概念 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 这个概念有点抽象,桥接顾名思义,通过搭桥的方式让本不想关联的对象互相调用。 可以联想牛郎织女鹊桥会。 2.类图 1). IDAL 与 IBLL两个类相互依赖,具体的实现DAL1(或DAL2)与BLL实现相互独立互不影响。 2)....

云计算? 154

Java 设计模式之桥接模式(Bridge Pattern)

桥接模式(Bridge Pattern)是一种用于将抽象部分与其实现部分分离的结构型设计模式。这种模式通过组合关系而不是继承关系来连接抽象与实现,使代码更具扩展性和维护性。桥接模式的核心思想是将抽象和实现解耦,使得两者可以独立变化。桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象部分与其实现部分分离,从而使两者可以独立地变化。桥接模式通过组合关系代替继承关系,将抽象和实现解耦,使代码更具扩展性和维护性。

微笑听雨 2836

秒懂设计模式之桥接模式(Bridge Pattern)

前言 人在IT江湖飘,不懂设计模式咋装X? 定义 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。 使用场景 顾名思义,桥我们大家都熟悉,就是用来将河的两岸联系起来。此处的桥是要将抽象部分与实现部分联系起来。有的同学要抱怨了:尼玛,你本来是为了解释不熟悉的事物,结果又引入两个...

ShuSheng007的程序人生 5179

JAVA设计模式之桥接模式

转自http://www.kongzid.com/archives/design9,桥接模式(Bridge Pattern),又称为柄体(Handle and Body)模式或接口(Interface)模式。将抽象部分与它的实现分离,并不是说让抽象类与其派生类分离,而是用抽象类和它的派生类用来实现自己的对象。(将抽象化(Abstraction)与实现化Implementation)脱耦,使得二者可以独立地变化) 从众多的事物中抽取出共同的、本质...

孔子说 965

C++设计模式——桥接模式(Bridge Pattern)

C++设计模式——桥接模式(Bridge Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——桥接模式(Bridge Pattern)目录引言定义定义结构代码示例总结桥接模式和策略模式桥接模式和适配器模式适用场景优缺点参考资料 引言 假如有三个品牌的手机vivo,oppo和小米,如果手机手机壳一体生产,会是这样的: 对应到相应的类中,将是1+3+6=10个有继承关系的类,如果这时再加一个华为手机,无疑是要多增加3个类,会带来类的急剧增长。 如果手机手机壳分开生产,然后按需搭配,

leonardohaig的博客 1411

设计模式:桥接模式(Bridge Pattern)

桥接模式是一种结构型设计模式,它的主要作用是将抽象部分与实现部分分离,使它们能够独立变化。换句话说,就是把“抽象”和“实现”放到两个独立的类层次中,通过组合而不是继承来连接它们。

TechNomad的博客 1071

[Unity 设计模式]桥接模式(BridgePattern)

1.前言 继上一讲IOC模式的基础上继续本讲桥接模式,笔者感觉桥接模式是23种设计模式中桥接模式是最好用但也是最难理解的设计模式之一,23中设计模式就好武侠剧中一本武功秘籍,我们在工作过程中想要熟练运用其中的每一种设计模式就好比跟高手过招想要能运用好武侠秘籍中的每一招每一式,并且能随着对手出招的不同我们能随机应变对应的招数,这就要求我们对每一种设计模式都理解的非常深刻才能运用自如,打出组合拳的效

bmw601055的博客 521

设计模式 桥接模式(Bridge Pattern)

这种模式的主要目的是解耦一个类的接口与其实现部分,从而可以更加灵活地给一个对象配置不同的功能实现。这提高了系统的可扩展性,因为你可以独立地增加新的实现类或抽象类。当调用Refined Abstraction的方法时,它将请求转发给它的Implementor对象。在创建时,将一个具体的Implementor实例传递给Refined Abstraction。Implementor执行具体的实现,并返回结果给Refined Abstraction。创建 支持的 接口 抽象实现 原有的 形状实现。

ling_zhi_xin的博客 1102

【JAVA设计模式】之桥接模式(BridgePattern)

桥接模式的作用是将两样东西连接起来,比如桥梁把河的两岸连接起来 桥接模式把“类的功能层次结构”和“类的实现层次结构”连接起来 类的层次结构 类的功能层次:父类通过定义抽象方法来定义接口API 类的实现层次:子类通过实现具体方法来实现接口API 示例程序 相关类一览表 类的层次 类名 描述 功能层 Express 快递寄件 功能层 EnhanceExpress (寄件)增加代收功能 实现层 ICompany 快递公司 实现层

兵临城下的博客 358
上一篇: 设计模式之适配器模式
下一篇: 设计模式之组合模式
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值