基于枚举实现的桥接模式

基于枚举实现的桥接模式

这里是基于枚举方式来维护的桥接模式,维护抽象化和实现化的关系。

桥接模式的应用场景:
当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。

桥接模式通常适用于以下场景。
1.当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
2.当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
3.当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
4.桥接模式的一个常见使用场景就是替换继承。我们知道,继承拥有很多优点,比如,抽象、封装、多态等,父类封装共性,子类实现特性。继承可以很好的实现代码复用(封装)的功能,但这也是继承的一大缺点。因为父类拥有的方法,子类也会继承得到,无论子类需不需要,这说明继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。


文章目录

  • 基于枚举实现的桥接模式
      • 前言
  • 一、实例化接口
    • 1.1.实例化接口(颜色)
    • 1.2. 蓝色实现实例化接口(蓝色)
    • 1.3. 红色实现实例化接口(红色)
    • 1.4.白色实现实例化接口(白色)
    • 1.5.粉色实现实例化接口(粉色)
  • 二、使用枚举维护实例化接口
  • 三、抽象化接口(包的款式)
    • 3.1.双肩包实现抽象化接口(双肩包)
    • 3.2.腰包实现抽象化接口(腰包)
    • 3.3.手提包实现抽象化接口(手提包)
  • 四、使用枚举维护抽象化接口
  • 五、使用枚举实现的桥接设计测试
  • 总结


前言

用桥接(Bridge)模式模拟女士皮包的选购。

1.女士皮包有很多种,可以按用途分、按皮质分、按品牌分、按颜色分、按大小分等,存在多个维度的变化,所以采用桥接模式来实现女士皮包的选购比较合适。

2.本实例按用途分可选腰包(FannyPack)和手提包(HandBag),按颜色分可选蓝色(Bule)和红色(Red)。可以按两个维度定义为颜色类和包类。

颜色类(Color)是一个维度,定义为实现化角色,它有两个具体实现化角色:黄色和红色,通过getDesc()方法可以选择颜色;包类(Bag)是另一个维度,定义为抽象化角色,它有两个扩展抽象化角色:挎包和钱包,它包含了颜色类对象,通过getName() 方法可以选择相关颜色的挎包和钱包。

一、实例化接口

1.1.实例化接口(颜色)

代码如下(示例):

package com.jareny.jave.design.bridge.impl;public interface Implementor {public void OperationImpl(String name);}

1.2. 蓝色实现实例化接口(蓝色)

代码如下(示例):

package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class BueImplementor implements Implementor {// 指定 颜色的类型private ColourEnum colourEnum = ColourEnum.Blue;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}}

1.3. 红色实现实例化接口(红色)

代码如下(示例):

package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class RedImplementor implements Implementor {// 指定 颜色的类型private ColourEnum colourEnum = ColourEnum.Red;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}
}

1.4.白色实现实例化接口(白色)

代码如下(示例):

package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class WhiteImplmentor implements Implementor {// 指定 颜色的类型private ColourEnum colourEnum = ColourEnum.White;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}
}

1.5.粉色实现实例化接口(粉色)

代码如下(示例):

package com.jareny.jave.design.bridge.impl;import com.jareny.jave.design.bridge.enums.ColourEnum;public class PinkImplementor implements Implementor {// 指定 颜色的类型private ColourEnum colourEnum = ColourEnum.Pink;@Overridepublic void OperationImpl(String name) {System.out.println(colourEnum.getDesc() +":"+ name);}
}

二、使用枚举维护实例化接口

代码如下(示例):

package com.jareny.jave.design.bridge.enums;import com.jareny.jave.design.bridge.impl.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;/*** 颜色*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ColourEnum {/*** 颜色分类*/Blue("蓝色"){@Overridepublic Implementor getImplementor() {return new BueImplementor();}},Red("红色"){@Overridepublic Implementor getImplementor() {return new RedImplementor();}},White("白色"){@Overridepublic Implementor getImplementor() {return new WhiteImplmentor();}},Pink("粉色"){@Overridepublic Implementor getImplementor() {return new PinkImplementor();}},;// 描述private String desc;public abstract Implementor getImplementor();
}

三、抽象化接口(包的款式)

3.1.双肩包实现抽象化接口(双肩包)

代码如下(示例):

package com.jareny.jave.design.bridge.abstraction;import com.jareny.jave.design.bridge.enums.BagsEnum;
import com.jareny.jave.design.bridge.enums.ColourEnum;
import com.jareny.jave.design.bridge.impl.Implementor;
import java.util.stream.Collectors;public class BackpackAbstraction extends Abstraction {// 指定 枚举类型BagsEnum bagsEnum = BagsEnum.Backpack;public BackpackAbstraction() {this.implementorList = bagsEnum.getColourList().stream().map(ColourEnum::getImplementor).collect(Collectors.toList());}@Overridepublic void Operation() {// 桥接操作for (Implementor imple : implementorList) {imple.OperationImpl(bagsEnum.getName());}}
}

3.2.腰包实现抽象化接口(腰包)

代码如下(示例):

package com.jareny.jave.design.bridge.abstraction;import com.jareny.jave.design.bridge.enums.BagsEnum;
import com.jareny.jave.design.bridge.enums.ColourEnum;
import com.jareny.jave.design.bridge.impl.Implementor;
import java.util.stream.Collectors;public class FannyPackAbstraction extends Abstraction {// 指定 枚举类型BagsEnum bagsEnum = BagsEnum.FannyPack;public FannyPackAbstraction() {this.implementorList = bagsEnum.getColourList().stream().map(ColourEnum::getImplementor).collect(Collectors.toList());}@Overridepublic void Operation() {// 桥接操作for (Implementor imple : implementorList) {imple.OperationImpl(bagsEnum.getName());}}
}

3.3.手提包实现抽象化接口(手提包)

代码如下(示例):

package com.jareny.jave.design.bridge.abstraction;import com.jareny.jave.design.bridge.enums.BagsEnum;
import com.jareny.jave.design.bridge.enums.ColourEnum;
import com.jareny.jave.design.bridge.impl.Implementor;
import java.util.stream.Collectors;public class HandbagAbstraction extends Abstraction {// 指定 枚举类型BagsEnum bagsEnum = BagsEnum.Handbag;public HandbagAbstraction() {this.implementorList = bagsEnum.getColourList().stream().map(ColourEnum::getImplementor).collect(Collectors.toList());}@Overridepublic void Operation() {// 桥接操作for (Implementor imple : implementorList) {imple.OperationImpl(bagsEnum.getName());}}
}

四、使用枚举维护抽象化接口

代码如下(示例):

package com.jareny.jave.design.bridge.enums;import com.google.common.collect.Lists;
import com.jareny.jave.design.bridge.abstraction.Abstraction;
import com.jareny.jave.design.bridge.abstraction.BackpackAbstraction;
import com.jareny.jave.design.bridge.abstraction.FannyPackAbstraction;
import com.jareny.jave.design.bridge.abstraction.HandbagAbstraction;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import java.util.List;@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum BagsEnum {/*** 包分类*/Handbag("手提包"){@Overridepublic Abstraction getAbstraction() {return new HandbagAbstraction();}@Overridepublic List<ColourEnum> getColourList() {return Lists.newArrayList(ColourEnum.values());}},Backpack("双肩包"){@Overridepublic Abstraction getAbstraction() {return new BackpackAbstraction();}@Overridepublic List<ColourEnum> getColourList() {return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.Pink);}},FannyPack("腰包"){@Overridepublic Abstraction getAbstraction() {return new FannyPackAbstraction();}@Overridepublic List<ColourEnum> getColourList() {return Lists.newArrayList(ColourEnum.Red,ColourEnum.Blue,ColourEnum.White);}},;private String name;// 获取抽象public abstract Abstraction getAbstraction();// 获取实现化列表public abstract List<ColourEnum> getColourList();}

五、使用枚举实现的桥接设计测试

运行结果

package com.jareny.jave.design.bridge;import com.jareny.jave.design.bridge.abstraction.Abstraction;
import com.jareny.jave.design.bridge.enums.BagsEnum;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class BridgeExample {public static void main(String[] args) {// 获取所有抽象化列表List<Abstraction> abstractionList = Stream.of(BagsEnum.values()).map(BagsEnum::getAbstraction).collect(Collectors.toList());// 所有抽象化列表开始操作abstractionList.forEach(abstraction ->{System.out.println("======= 输出桥接后的结果 ======= ");abstraction.Operation();System.out.println("");});}
}
======= 输出桥接后的结果 ======= 
蓝色:手提包
红色:手提包
白色:手提包
粉色:手提包======= 输出桥接后的结果 ======= 
红色:双肩包
蓝色:双肩包
粉色:双肩包======= 输出桥接后的结果 ======= 
红色:腰包
蓝色:腰包
白色:腰包

总结

本文仅通过使用枚举的方式来来维护实例化接口、抽象化接口,同时使用枚举来维护抽象化和实例化之前的关系,通过扫描枚举的方式来获取到所有的抽象化和实例化桥接的结果。

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

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

相关文章

【微信小程序】绘制二维码实现及解决canvas层级问题最佳实践

前言 很久没写微信小程序的需求了&#xff0c;今天来活儿要做个二维码扫码相关的需求&#xff0c;本来以为是洒洒水的事情&#xff0c;谁知道也折磨了大半天&#xff0c;今天特此记录一下~ 需求&#xff1a;点击按钮&#xff0c;弹出二维码&#xff0c;二维码内容固定为test …

独孤思维:不喜爱的再赚钱也别碰,因为你爱无能

很多人都说什么工作收入高做什么&#xff1b; 很多女人说哪个男人有钱嫁哪个&#xff1b; 很多粉丝说什么项目赚钱做什么。 本质上不是你爱这个工作&#xff0c;爱这个男人&#xff0c;爱这个项目。 而是你爱钱。 但是爱钱&#xff0c;要付出代价。 工作收入高&#xff0…

Dubbo框架

1&#xff1a;简介 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架 Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题 这是Dubbo官网的介绍&#xff0c;下面是我对这dubbo的理解 首先介绍下什么是RPC&#xff1a; 常…

为什么说品牌低价不是一件好事

消费者货比三价为的是买到低价质优的产品&#xff0c;而网络电商平台的公开&#xff0c;也促进了消费者及品牌进行比价&#xff0c;那品牌低价一定就是好事吗&#xff0c;一定会拉高品牌销量吗。其实是不一定的&#xff0c;低价意味着成本的降低&#xff0c;也可能滋生很多产品…

【精选】改进的YOLOv5:红外遥感图像微型目标的高效识别系统

1.研究背景与意义 随着科技的不断发展&#xff0c;红外遥感技术在军事、安防、环境监测等领域中得到了广泛应用。红外遥感图像具有独特的优势&#xff0c;可以在夜间或恶劣天气条件下获取目标信息&#xff0c;因此在小目标检测方面具有重要的应用价值。然而&#xff0c;由于红…

专注短视频账号矩阵系统源头开发---saas工具

专注短视频账号矩阵系统源头开发---saas营销化工具&#xff0c;目前我们作为一家纯技术开发团队目前已经专注打磨开发这套系统企业版/线下版两个版本的saas营销拓客工具已经3年了&#xff0c;本套系统逻辑主要是从ai智能批量剪辑、账号矩阵全托管发布、私信触单收录、文案ai智能…

微服务实战系列之签名Sign

前言 昨日恰逢“小雪”节气&#xff0c;今日寒风如约而至。清晨的马路上&#xff0c;除了洋洋洒洒的落叶&#xff0c;就是熙熙攘攘的上班族。眼看着&#xff0c;暖冬愈明显了&#xff0c;叶子来不及泛黄就告别了树。变化总是在不经意中发生&#xff0c;容不得半刻糊涂。 上集博…

kubernetes 部署 spinnaker

spinnaker简介 Spinnaker 是一个开源、多云持续交付平台&#xff0c;它将强大而灵活的管道管理系统与主要云提供商的集成相结合。Spinnaker 提供应用程序管理和部署&#xff0c;帮助您快速、自信地发布软件变更。 Spinnaker 提供了两组核心的功能&#xff1a; 应用管理与应用程…

从根到叶:随机森林模型的深入探索

一、说明 在本综合指南中&#xff0c;我们将超越基础知识。当您盯着随机森林模型的文档时&#xff0c;您将不再对“节点杂质”、“加权分数”或“成本复杂性修剪”等术语感到不知所措。相反&#xff0c;我们将剖析每个参数&#xff0c;阐明其作用和影响。通过理论和 Python 实践…

Navicat 技术指引 | 适用于 GaussDB 的备份与还原功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…

如何评估供应商协同平台的功能和性能

在制造业中&#xff0c;供应商协同平台是一种重要的工具&#xff0c;可以帮助企业与供应商建立更紧密的合作关系&#xff0c;提高采购效率&#xff0c;降低成本。而SRM系统是一种集成的供应链管理系统&#xff0c;可以协调和管理企业与供应商之间的业务关系&#xff0c;包括供应…

【lodash】 关于Some的相关用法

1. 判断集合某个字段是否存在小于0 的 使用 lodash 库的 some 函数可以用来判断集合中某个字段是否存在小于 0 的值。你可以使用以下代码实现&#xff1a; const _ require(lodash);const collection [{ id: 1, value: 10 },{ id: 2, value: -5 },{ id: 3, value: 20 }, ];…

Sealos 云操作系统私有化部署教程

Sealos 私有云已经正式发布了&#xff0c;它为企业用云提供了一种革命性的新方案。Sealos 的核心优势在于&#xff0c;它允许企业在自己的机房中一键构建一个功能与 Sealos 公有云完全相同的私有云。这意味着企业可以在自己的控制和安全范围内&#xff0c;享受到公有云所提供的…

OTP语音芯片WTN6xxx-8S与Flash语音芯片WT588F02B-8S的区别与应用选择

随着科技的快速发展&#xff0c;语音芯片已经成为了电子产品中不可或缺的一部分。唯创知音作为知名的语音芯片制造商&#xff0c;推出了OTP语音芯片WTN6xxx-8S和Flash语音芯片WT588F02B-8S两款产品。本文将对比这两款芯片的区别&#xff0c;以帮助读者更好地选择适合的语音芯片…

高通OTA升级方案介绍

高通OTA升级方案介绍 1. 高通LE OTA1.1 背景1.2 Recovery系统 2. SDX12 OTA方案3 OTA包的加密 3UK Penetration Test对于OTA升级也有严格的安全要求&#xff0c;下面是几条用例要求&#xff1a; Firmware: A sufficiently strong signing key MUST be in use. Signing keys MUS…

了解消息队列的五大痛点

文章字数&#xff1a;400字&#xff0c;建议阅读时间&#xff1a;3分钟&#xff0c;阅读难度&#xff1a;中等。 解决消息队列的五大痛点 在分布式系统中&#xff0c;消息队列&#xff08;MQ&#xff09;是一种重要的组件&#xff0c;它能够帮助我们处理并发和异步的问题。然…

visionOS空间计算实战开发教程Day 6 拖拽和点击

在之前的学习中我们在空间中添加了3D模型&#xff0c;但在初始摆放后就无法再对其进行移动或做出修改。本节我们在​​Day 5​​显示和隐藏的基础上让我们模型可以实现拖拽效果&#xff0c;同时对纯色的立方体实现点击随机换色的功能。 首先是入口文件&#xff0c;无需做出改变…

Linux反弹SHell与检测思路

免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 反弹shell payload在线生成 https://www.chinabaiker.com/Hack-Tools/ Online - Reverse Shell G…

Talk | UCSB博士生宋珍巧:基于人工智能的功能性蛋白质设计

本期为TechBeat人工智能社区第549期线上Talk。 北京时间11月22日(周三)20:00&#xff0c;UC Santa Barbara博士生—宋珍巧的Talk已准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “基于人工智能的功能性蛋白质设计”&#xff0c;介绍了如何利用机器学习算…

linux下文件夹上有个锁或者x 如何去除

发现linux下文件夹上有个锁或者x 如何去除 原因 权限问题 解决方法 sudo chmod 777 filename 去除当前文件夹以及所有子文件夹 sudo chmod -R 777 filename