桥接模式——连接抽象维度和实现维度

news2024/12/1 8:41:01

桥接模式 bridge pattern

一 定义

桥接模式,是将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。它是将两个不同的维度建立联系。这两个维度通常是指:抽象维度和实现维度。

使用场景

  1. 在抽象和具体实现之间需要增加更多的灵活性的场景。
  2. 一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展。
  3. 不希望使用继承,尤其是多层继承。

标准示例

在这里插入图片描述
如类图所示:
AbstractionRefinedAbstraction 是抽象维度体系;
IimplementorConcreteImplementorA ConcreteImplementorB 是实现维度体系;
Abstraction 作为桥梁,将抽象维度和实现维度进行了连接。

更多示例

接下来我们来举两个例子说明桥接模式的使用。


第一个例子是 快餐店。
众所周知,比较知名的几个洋快餐有:肯德基、麦当劳、汉堡王。
他们都属于快餐品牌。所以我们创建一个快餐店的抽象类:FastRestaurant。
然后让 KFCRestaurant、McRestraurant、BkRestraurant继承FastRestaurant。
各个快餐店都有自己的薯条和可乐。

接下来,我们做三件事情:
第一件事情:
所以我们创建薯条接口(Frenchfries)和可乐接口(Cola),
薯条接口里有个吃薯条的方法;可乐接口里有个喝可乐的方法。

//薯条接口
public interface Frenchfries {
	//吃薯条
    void eatFrenchfries();
}

//可乐接口
public interface Cola {
	//喝可乐
    void drinkCola();
}

第二件事情:
我们给FastRestaurant
① 增加两个属性,可乐和薯条。
② 增加两个方法:喝可乐(getCola)、吃薯条(getFrenchfries)。

//快餐店(抽象类)
public abstract class FastRestaurant {
	//可乐
    protected Cola cola;
    //薯条
    protected Frenchfries frenchfries;

	//构造函数给属性赋值
    public FastRestaurant(Cola cola,Frenchfries frenchfries){
        this.cola = cola;
        this.frenchfries = frenchfries;
    }
	//喝可乐
    public void drinkCola(){
        this.cola.drinkCola();
    }
    //吃薯条
    public void eatFrenchfries(){
        this.frenchfries.eatFrenchfries();
    }
}

第三件事情:
然后让三家品牌都继承抽象类FastRestaurant。
BkCola、BkFrenchfries
KfcCola、KfcFrenchfries
McCola、McFrenchfries

//KFC (其他两个类似)
public class KfcRestaurant extends FastRestaurant{
    public KfcRestaurant(Cola cola, Frenchfries frenchfries) {
        super(cola, frenchfries);
    }
}

接下来,我们要去KFC吃汉堡和可乐:

public class MainTest {
    public static void main(String[] args) {
        Cola cola = new KfcCola();
        Frenchfries frenchfries = new KfcFrenchfries();
        FastRestaurant restaurant = new KfcRestaurant(cola,frenchfries);
        restaurant.drinkCola();
        restaurant.eatFrenchfries();
    }
}

执行后的输出结果:

Drink KFC's cola.
Eat KFC's French fries.

上述洋快餐的例子中,抽象的快餐店(FastRestaurant)充当了桥梁,连接了具体的快餐店(fcRestaurant)和 Cola、Frenchfries接口的实现(KfcCola、KfcFrenchfries)
我们来看类图:
在这里插入图片描述


我们再举个例子。
我们在购物时,经常有各种优惠活动。
比如满100减10,就是满金额直减;比如满200打8折,就是满金额折扣;比如满10件打9折,就是满数量折扣。
不难发现,就上述三种优惠来说,它是由条件规则+优惠 组成的。
我们把“满100”称为 rule,把“减10”称为 promotion。
下面来讲我们如何实现这些优惠。
首先我们定义一个抽象的条件规则类:AbstractRule

//抽象规则类
public abstract class AbstractRule {
	//优惠
    protected IPromotion promotion;
    //规则名称
    protected String rule;
	//通过构造方法赋值
    public AbstractRule(IPromotion promotion,String rule){
        this.rule = rule;
        this.promotion = promotion;
    }
    //获取优惠
    public void getPromo(){
        this.promotion.getPromotion(rule);
    }
}

接下来,我们定义优惠接口。

//优惠接口
public interface IPromotion {
	//获取优惠
    void getPromotion(String rule);
}

然后给出具体的条件规则:满金额的规则和满数量的规则。

//满金额规则类
public class FullAmountRule extends AbstractRule{
    public FullAmountRule(IPromotion promotion,String rule) {
        super(promotion,rule);
    }
}

//满数量规则类
public class FullQuantityRule extends AbstractRule{
    public FullQuantityRule(IPromotion promotion,String rule) {
        super(promotion,rule);
    }
}

紧接着是要给出优惠接口的实现:直减优惠和折扣优惠。

public class DirectAmount implements IPromotion{
    @Override
    public void getPromotion(String rule) {
        System.out.println(rule + " direct reduce amount");
    }
}

public class Discount implements IPromotion{
    @Override
    public void getPromotion(String rule) {
        System.out.println(rule + " discount.");
    }
}

最后,我们来看一下这个优惠规则的实际使用效果:

public class MainTest {
    public static void main(String[] args) {
        //满金额
        String rule = "Full amount";
        //直减
        IPromotion promotion = new Discount();
        //优惠
        AbstractRule theRule = new FullAmountRule(promotion,rule);
        
        theRule.getPromo();
    }
}

执行后的输出结果:

Full amount discount.

同样给出类图,发现与上面的图很相似(这就是桥接的模样):
在这里插入图片描述


以上就是桥接模式的全部内容,欢迎阅读。

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

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

相关文章

找不到dll的问题解决,loadlibrary 126错误

症状:loadlibrary时,getlasterror返回126,表示是找不到模块错误。来到目录下看到依赖所需的dll均存在 解决办法: 1.下载ProcmonProcmom-监视进程所有的动作资源-CSDN文库https://download.csdn.net/download/gergul/880597622.运…

RocketMQ第四节(部署模式、监控面板等)

1:mq的部署模式 部署方式 | RocketMQ 参考官网。 单机模式:抗风险能力差,单机挂机没服务,单机硬盘损坏,丢失数据 多机(多master没有Slave副本): 多个master采用RAID10磁盘,不会丢…

[java安全]类加载器CommonsCollections3

文章目录 【java安全】类加载器&CommonsCollections3前言java类加载器URLClassLoader利用ClassLoader#defineClass()直接加载字节码 使用TemplatesImpl加载字节码TemplatesImpl中字节码实现AbstractTranslet类 构造未完成POCTrAXFilter类调用newTransformer()InstantiateTr…

【AI绘画Stable Diffusion】高清图像放大+面部修复+一键抠图,谈谈你可能不知道的优化技巧!

一提起后期处理,我猜你可能立马想到的就是图像放大。 今天,我要向你展示的后期处理手法,以及优化技巧。 图片放大算法 如果你常用的是秋叶大佬的整合包,那么你对"R-ESRGAN 4x"和"R-ESRGAN 4x Anime6B"应该…

FPGA单端口RAM——IP核

文章目录 前言一、RAM简介1、随机存储器IP核分类1、RAM IP核2、ROM IP核 2、RAM IP核 二、IP核配置步骤三、源码1、ram_rw驱动文件2、ip_1port_ram顶层文件3、仿真文件4、仿真波形 四、SignalTap II在线调试五、总结六、参考资料 前言 环境: 1、Quartus18.1 2、vsco…

Leetcode-每日一题【1019.链表中的下一个更大结点】

题目 给定一个长度为 n 的链表 head 对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。 返回一个整数数组 answer ,其中 answer[…

Servlet的监听器

Servlet常用的监听器 ServletContextAttributeListener 用来感知ServlerContext对象属性变化,比如添加或删除属性变化 ServletContextListener 用来感知ServlerContext对象的创建和销毁的 ServletRequestListener 可以用来监听感知ServletRequest对象的创建和销毁的…

大语言模型(LLM)评估综述

论文地址:https://arxiv.org/abs/2307.03109 Github地址:https://github.com/MLGroupJLU/LLM-eval-survey 一 、背景 随着ChatGPT和GPT-4的推出,大型语言模型(LLM)在学术界和工业界的热度日益升高,这主要…

优雅的设计测试用例

⭐️前言⭐️ 入职以后接触到了公司的具体业务,提升了设计测试用例的能力,于是沉淀出这篇文档与大家分享。 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录收获&…

Acwing.905 区间选点(贪心)

题目 给定N个闭区间[a,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数N,表示区间数。 接下来N行,每行包含两个整数…

Linux内核《CPU负载计算》

目录 前言一、什么是CPU负载?二、如何计算CPU负载三、计算CPU负载的一个脚本四、top命令详解 前言 在实际的产品开发中,我们往往需要关注CPU的负载,确保程序可以长久稳定的运行,并且能够重复发挥SOC的性能。Linux中提供了一些命令…

ArrayList和LinkedList

ArrayList的注意事项 1、在ArrayList中可以放任意元素,包括空值,任何元素,且可重复添加。 2、ArrayList底层是由数组来实现数据存储的 3、ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高),看源码 在多线程的…

【Linux系列P7】进度条小程序的深度解剖(细节满满)

​​​​​ ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读&am…

SpringBoot项目中MVC使用--【SB系列之010】

SpringBoot系列文章目录 SpringBoot 的项目编译即报错处理–SB系列之001 —第一部的其它章节可以通过001链接 SpringBoot项目中WEB页面放哪里–【SB系列之008】 SpringBoot项目中WEB与Controller的联系–【SB系列之009】 ———————————————— 文章目录 SpringBoo…

线程池学习(五)线程工厂、线程池工厂

Executors 定义的Executor, ExecutorService, ScheduledExecutorService, ThreadFactory和Callable类的工厂和实用程序方法,我们称为线程池工厂。ThreadFactory 为定制化创建新线程的对象,我们称为线程工厂 前面几期的学习中,我已经初步会使用线程池了&…

用于公司文件防泄密用的保密软件(企业数据防泄密软件)

防止公司文件泄露是指采取各种措施和方法,以防止公司的敏感和机密文件被未经授权的人员获取、泄露或滥用的行为。 这些文件可能包含公司的商业机密、客户数据、财务信息、研发成果等重要资料,如果泄露给竞争对手、黑客或其他恶意人员,可能会对…

未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

offiice64位的按装名字短的,office32位的安装名字长的 安装32位的AccessDatabaseEngine.exe,如果使用64位office点击安装32位access时提示无法安装,此时需要: 1.WINR打开运行,输入CMD,进入安装包文件夹 …

AHD模拟高清方案汇总及国产替代方案

由于模拟高清方案对比LVDS数字高清方案在降本、远距离传输的优势明显,及实现方案相对简单,模拟相机一直在车载和安防监控产品上有着较重要的市场地位。伴随着ZM贸易战和境外疫情影响愈来愈趋于严重化,原有外来品牌公司模拟高清方案在产品交期…

LeetCode 75 第五题(345)反转字符串中的元音字母

题目: 示例: 分析: 给一个字符串,将里面的元音字母反转,并且保持非元音字母不变(包括顺序). 字符串反转类型的题,我们都可以使用双指针来解决:定义首尾指针,分别向中间靠拢,直到首尾指针都指向了元音字母,然后交换首尾指针所指的字母,如此不会影响到非元音字母,同时也将元音字…

【4】Vite+Vue3左右容器中相同属性的元素内容自动对齐

在当今前端开发的领域里,快速、高效的项目构建工具以及使用最新技术栈是非常关键的。ViteVue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。 作为下一代前端构建工具,Vite 在开发中的启动速度和热重载方面具有突…