设计模式大赏(一):桥接模式,组合模式

news2024/11/24 3:38:39

设计模式大赏(一):桥接模式,组合模式

在这里插入图片描述

导言

本篇文章是设计模式大赏中的第一篇文章,这个系列的文章中我们主要将介绍一些常见的设计模式,主要是我在看Android源码中发现用到的一些设计模式。本篇文章将主要介绍桥接模式
组合模式 这两种设计模式。

本篇文章主要参考:《大话设计模式》

桥接模式

在这里插入图片描述

Android中的桥接模式

我一开始接触到桥接模式是在学习Android的WindowManager相关的源码过程中,具体来说,WindowManager的实现类WindowManagerImpl实际上并不直接实现相关的请求,而是将其委托给WindowManagerGlobal这个单例类来实现。这样将实现分为抽象和具体两部分的模式就叫做桥接模式

合成/聚合复用原则

在正式介绍到桥接模式之前我们需要先介绍一下合成聚合复用原则,该原则的核心思想就是:尽量使用合成和聚合,而不要去使用类的继承

聚合表示一种弱的拥有关系,即A对象可以包含B对象,但B对象不是A对象的一部分。比如说整个班级中可以包含我们个人,但是我们个人并不是班级的一部分,我们脱离开班级还是可以独立存在的,班级脱离我们也可以独立存在。

合成则表示一种强的拥有关系,比如说鸡翅对于鸡一样,显然鸡翅是鸡的一部分,他们的生命周期是一致的,谁也脱离不开谁。

但无论是聚合还是合成关系,他们的耦合强度都要低于继承,继承是一种强耦合的关系,遵循合成/聚合复用原则可以防止类发展成一个难以管理的庞然大物。

桥接模式的概念

桥接模式(Bridge),是一种将抽象部分与它的实现部分分离,使他们都可以独立变化的一种设计模式。

下面是一个标准的桥接模式的基本模板:
在这里插入图片描述
实际上这样说还是很抽象,我们可以借用大话设计模式中的例子来说明:
比如说对手机来说,我们可以将其拆分出两个抽象的概念:手机的硬件和手机的软件,对于我们Android端来说,各个手机厂商的硬件之间都是高度定制化的,所以我们可以将其简化为手机厂商的品牌和手机的软件这两个抽象:

在这里插入图片描述
显然各个品牌手机的手机都会持有各自的手机软件,但是手机软件并不是属于手机的一部分,这是一种聚合持有的关系。这样分类的原因就是为了方便手机品牌和手机软件之间各自的拓展:即为每个抽象添加功能不涉及到其他类的修改。

实际上,我觉得桥接模式强调的就一点:通过多个角度将一个系统进行切分,使各个部分在变化的时候不影响其他部分的变化。

这样做的好处有:

  1. 使系统更加灵活,能够独立地扩展和变化抽象部分和实现部分。
  2. 提高了系统的可维护性和可扩展性,因为可以通过添加新的抽象或实现类来扩展系统。

桥接模式的具体示例

为了更好地理解,接下来引入一个具体的实例:比如说我们想要生产瓶装饮料的话,就可以将这整个罐装饮料抽象成两个部分:装饮料的瓶子和具体的饮料

在这里插入图片描述
下面是我的示例代码:

fun main() {
    val Glass:Bottle = GlassBottle(Cola())
    val Plastic:Bottle = PlasticBottle(Sprite())
    val Bridge = BottleBridgeImpl()
    Bridge.LoadDrink(Glass)
    Bridge.LoadDrink(Plastic)
}
//抽象类-瓶子
abstract class Bottle(var mDrinks:Drinks) {
    //制作瓶子的方法
    abstract fun MakeBottle()

}
//抽象类-饮料
abstract class Drinks{
    //生产饮料的方法
    abstract fun MakeDrinks()
}
//抽象出连接上面两个抽象类的桥接方法
interface BottleBridge{
    //装瓶的方法
    fun LoadDrink(bottle:Bottle)
}

class BottleBridgeImpl():BottleBridge{
    override fun LoadDrink(bottle: Bottle) {
        println("压缩装瓶,倒入${bottle.mDrinks}")
    }
}

class GlassBottle(mDrinks: Drinks):Bottle(mDrinks) {
    override fun MakeBottle() {
        println("生产玻璃瓶")
    }
}

class PlasticBottle(mDrinks: Drinks):Bottle(mDrinks) {
    override fun MakeBottle() {
        println("生产塑料瓶")
    }
}

class Cola():Drinks(){
    override fun MakeDrinks() {
        println("生产可乐")
    }

    override fun toString(): String {
        return "可乐"
    }
}

class Sprite():Drinks() {
    override fun MakeDrinks() {
        println("生产雪碧")
    }

    override fun toString(): String {
        return "雪碧"
    }
}

此处我将饮料和瓶子这两部分抽象出来,并引入了一个连接这两个部分的桥接接口,这样饮料和瓶子这两个抽象概念在变化的过程只需要维护自身的制造方法即可而不需要关注其他部分。

总而言之,我觉得桥接模式的核心就是从多个维度将一个系统进行拆分,抽象出各个抽象部分,然后各个抽象部分各自有自己的实现,使得一个抽象部分的具体实现变化时不影响其他的部分。

组合模式

在这里插入图片描述

组合模式的概念

组合模式,是将对象组合成树形结构以表示整体-部分的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性

这整个描述里有两个关键字:树形结构以及一致性。这里我们可以以一个学校的管理为例,学校的管理系统首先是一个大的全局的学校管理系统,向下细分又可以分为学院管理系统,再向下还可以分为各个专业的管理系统,这整个结构是一个树形的结构;而对于各个层级的管理系统我们肯定希望他们对具体信息的操作是一致的,比如说我们可以在学院管理系统对学生A进行加分操作,也可以在专业管理系统中对学生A进行加分操作,这个加分操作无论是在哪个层级的管理系统中发起的都应该有一致的效果,这就是一致性

下面是组合模式的典型结构图:
在这里插入图片描述

Android中的组合模式

说到这里是不是觉得这个组合模式很像Android中ViewGroup和View的组合关系,实际上确实如此,通过使用组合模式,Android开发人员可以更容易地管理和操作UI元素,以便以可扩展和灵活的方式构建用户界面。每个 ViewGroup 作为容器可以包含多个子 View,从而形成了整个布局的层次结构。
在这里插入图片描述

何时使用组合模式

使用组合模式的最佳场景就是当你发现需求中体现的是整体与部分层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,此时就应该考虑使用组合模式了,在上面说到了Android整个视图层次就是用到了组合模式,实际上Java上的UI层次也类似。

这个组合模式如果理解了Android中View的视图层次应该就很形象了,此处就不再另加例子,大家可以去看看Android中View的视图层次。

使用组合模式的好处

使用组合模式的好处,首先我觉得如果体现的是整体与部分的层次结构时,使用组合模式显然可以让整个需求的层次更加清晰

其次,用户不用关心这到底是一个组件组还是一个组件,简单来说组合模式让用户可以一致地使用组合结构和单个对象。

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

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

相关文章

Android 快速实现隐私协议跳转链接

首先在string.xml创建对应字串 <string name"link">我已仔细阅读并同意<annotation value"privacy_policy">《隐私政策》</annotation>和<annotation value"service_agreement">《服务协议》</annotation></st…

十八、模型构建器(ModelBuilder)快速提取城市建成区——批量掩膜提取夜光数据、夜光数据转面、面数据融合、要素转Excel(基于参考比较法)

一、前言 前文实现批量投影栅格、转为整型,接下来重点实现批量提取夜光数据,夜光数据转面、夜光数据面数据融合、要素转Excel。将相关结果转为Excel,接下来就是在Excel中进行阈值的确定,阈值确定无法通过批量操作,除非采用其他方式,但是那样的学习成本较高,对于参考比较…

c++设计模式三:工厂模式

本文通过一个例子简单介绍简单工厂模式、工厂模式和抽象工厂模式。 1.简单工厂&#xff08;静态&#xff09; 假如我想换个手机&#xff0c;换什么手机呢&#xff1f;可以考虑苹果或者华为手机&#xff0c;那我们用简单工厂模式来实现这个功能&#xff1a; 我们关注的产品是手…

人工智能与航天技术的融合:未来发展的新趋势

人工智能与航天技术的融合&#xff1a;未来发展的新趋势 随着科技的飞速发展&#xff0c;人工智能和航天技术已经成为人类探索未知世界的重要工具。本文将探讨这两个领域的结合点&#xff0c;以及未来的发展趋势和应用前景。通过了解这些技术&#xff0c;读者将更好地理解人工…

用Python定义一个函数,用递归的方式模拟汉诺塔问题

【任务需求】 定义一个函数&#xff0c;用递归的方式模拟汉诺塔问题&#xff0c;三个柱子&#xff0c;分别为A、B、C&#xff0c;其中A柱子上有N个盘子&#xff0c;从小到大编号为1到N&#xff0c;盘子大小不同。现在要将这N个盘子从A柱子移动到C柱子上&#xff0c;但移动的过…

段页式管理方式

一、分段、分页的优缺点 1.分页管理&#xff1a;内存空间利用率高&#xff0c;无外部碎片&#xff0c;只有少量页内碎片&#xff0c;以物理结构划分&#xff0c;不便于按逻辑方式实现信息共享和保护 2.分段管理&#xff1a;为段长过大分配连续空间会很不方便&#xff0c;会产生…

Nginx动静分离以及防盗链问题

目录 1.动静分离 1.1概念 1.2准备环境 1.3.测试访问 2.Nginx防盗链问题 2.1nginx 防止网站资源被盗用模块 2.2防盗链配置 2.3准备两台机器 2.4测试 ①开启防盗链 ②让盗链ip可一访问服务资源 ③防盗链不设置none参数 1.动静分离 1.1概念 为了加快网站的解析速度&…

【图像分类】钢轨表面缺陷分类数据集介绍(4个类别)

写在前面&#xff1a; 首先感谢兄弟们的支持&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

Pytorch入门实例

数据集是受教育年限和收入,如下图 代码如下 import torch import numpy as np import matplotlib.pyplot as plt import pandas as pd import torch.nn as nn import torch.optim as optimdata pd.read_csv(./Income.csv)X torch.from_numpy(data.Education.values.reshape…

Windows环境下MosQuitto服务器搭建,安装mqtt服务端软件

1、下载、安装MosQuitto服务器 下载地址&#xff1a;http://mosquitto.org/files/binary/ 根据平台选择相应的代码下载。 安装完成后&#xff0c;安装文件夹下部分文件的功能

私有云:【9】Connection配置

私有云&#xff1a;【9】Connection配置 1、关闭IE增强配置2、Connection配置2.1、登录connection管理台配置许可证2.2、添加VCenter主机2.3、配置Composer 1、关闭IE增强配置 关闭此项 全部关闭 2、Connection配置 2.1、登录connection管理台配置许可证 上一章connection…

DevChat:你的私人助理,让工作变得如此简单!

前言&#xff1a; 首先我们来浅浅说下AI吧。有小伙伴把AI看得十分“高高在上”&#xff0c;觉得它属于“诸神之战”&#xff0c;与我等凡人无关。其实这个看法是不对的。就好像我们刚开始对于手机系统或者电脑系统感觉很有陌生感一样&#xff0c;一直到技术落地到抖音、微信等…

复习Animate和木疙瘩学习笔记-动画制作的回家之路

这个融媒体H5制作平台功能比较完善&#xff1a;包含了Flash(现在叫Animate)传统H5网页制作 720全景视频制作发布网页&#xff01; 主要功能&#xff1a;素材导入、2D动画制作、常见交互添加、发布生成链接二维码 基本就是一个制作H5为主&#xff0c;但是里面的动画可以依赖4种…

LeetCode 415 字符串相加 简单

题目 - 点击直达 1. 415 字符串相加 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 415 字符串相加 简单 1. 题目详情 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。…

[Java/力扣100]判断两棵二叉树是否相同

我希望通过这道题&#xff0c;能进一步了解递归思想和“树是递归定义的”这句话 分析 我们的目的是写一个方法来检验两棵树是否相同 什么叫“两棵树相同”&#xff1f;——相同的位置存在相同的结点 有三种情况&#xff1a;1、两棵树一颗为空一颗不为空——不相同&#xff…

高阶数据结构学习 —— 图(2)

文章目录 1、BFS1、DFS 1、BFS 广度优先。确定从哪个点开始&#xff0c;然后用队列来完成遍历。拿出一个点就把和这个点相连的其它点放进去&#xff0c;但是这样前面放进过队列的也有可能被再次放入&#xff0c;所以需要做好标记。一个队列&#xff0c;一个标记容器。在邻接矩…

NodeMCU ESP8266 面包板的介绍和使用详解(图文并茂)

文章目录 前言什么是面包&#xff1f;面包板的历史 如何使用&#xff1f;1 如何连接面包板2 如何读取面包板的行和列&#xff1f;面包板标签“”和“-”符号 3 电源轨连接4. 中心槽&#xff08;DIP 支持&#xff09; 实际案例总结 前言 在嵌入式学习的过程中&#xff0c;会遇到…

【ESP 保姆级教程】疯狂TFT篇 ——教你从0到1打造太空人时钟① TFT_eSPI、TJpg_Decoder库

系列最终效果,一步步进阶学习 忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-10-27❤️❤️ 本篇更新记录 2023-10-27❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何…

mathtype7.4破解永久激活码

MathType(数学公式编辑器)是由Design Science公司研发的一款专业的数学公式编辑工具。MathType功能非常强大&#xff0c;尤其适用于专门研究数学领域的人群使用。使用MathType让你在输入数学公式的时候能够更加的得心应手&#xff0c;各种复杂的运算符号也不在话下。 MathType最…

Android开发知识学习——登录和第三方授权

文章目录 学习资源来自&#xff1a;扔物线登录和授权的区别HTTP 中确认授权&#xff08;或登录&#xff09;的两种方式CookieAuthorization主流用法&#xff1a;Basic主流用法&#xff1a;Bearer&#xff1a;OAuth2 的流程&#xff1a;第三方 App 通过微信登录的流程Refresh to…