Java学习——设计模式——结构型模式2

结构型模式

结构型模式主要涉及如何组合各种对象以便获得更好、更灵活的结构。虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过组合与运行期的动态组合来实现更灵活的功能。

包括:
1、适配器
2、桥接
3、组合
4、装饰器Decorator
5、外观
6、享元
7、代理

装饰者模式

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式

结构
1、抽象构件:规范准备接收附加责任的对象
2、具体构件
3、抽象装饰角色:继承或实现抽象构建,并包含具体构建的实例,通过其子类扩展具体构建的功能
4、具体装饰角色

在这里插入图片描述
好处
1、装饰者模式可以带来比继承者更加灵活性的扩展功能,使用更加方便,可以通过组合不同装饰者对象来获取具有不同行为状态的多样化的结果。装饰者模式比继承更具良好的扩展性,完美的遵循开闭原则,继承是静态的附加责任,装饰者则是动态的附加责任
2、装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展成一个实现类的功能

桥接模式

将抽象与实现分离,使它们可以独立变化。是用组合关系代替继承关系来实现,从而降低了抽线和实现这两个可变维度的耦合度。

结构
1、抽象化角色
2、扩展抽象化角色
3、实现化角色
4、具体实现化角色

在这里插入图片描述
好处
1、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
2、实现细节对客户透明

外观模式

又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性

结构
1、外观角色
2、子系统角色

在这里插入图片描述
好处
1、降低了子系统与客户端之间的耦合度,使子系统的变化不会影响调用它的客户类
2、对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易

缺点:不符合开闭原则,修改很麻烦

组合模式

又名部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,创建了对象组的树形结构。

结构
1、抽象根节点
2、树枝节点
3、叶子节点

在这里插入图片描述
分类
根据抽象构建类的定义形式:

1、透明组合模式
抽象根节点角色中声明了所有用于管理成员对象的方法,这样做的好处是确保所有的构建类都有相同的接口。

缺点是不够安全,因为叶子对象和容器对象在本质上是有区别的,叶子对象不可能有下一个层次的对象,即不可能包含成员对象,因此提供方法是没有意义的,在编译阶段不会报错,在运行阶段如果调用这些方法可能会出错(如果没有提供相应的错误处理代码)

2、安全组合模式
抽象构件角色中没有声明任何用于管理成员对象的办法,而是在树枝节点中声明并实现这些方法。

缺点是不够透明,因为叶子构建和容器构件具有不同的方法,且容器构件中那些用一把管理成员对象的方法没有在抽象构件类中定义,因此客户端不能完全针对抽象编程,必须有区别地对待叶子构件和容器构件。

优点

1、组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
2、客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
3、在组合模式中增加新的树枝节点和叶子节点都很方便,无须对现有类库进行任何修改,符合“开闭原则”。
4、组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子节点和树枝节点的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。

享元模式

运用共享技术来有效地支持大量细粒度对象的复用。通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。

结构
存在两种状态:
1、内部状态,不会随着环境的改变而改变的可共享部分
2、外部状态,随环境改变而改变的不可以共享的部分。

角色:
1、抽象享元角色
2、具体享元角色
3、非享元角色
4、享元工厂角色

在这里插入图片描述

优点
1、极大减少内存中相似或相同对象数量,节约系统资源,提高系统性能
2、外部状态相对独立,且不影响内部状态

缺点:
为了使对象可以共享,需要将享元对象的部分状态外部化,分离内部状态和外部状态,使程序逻辑复杂

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

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

相关文章

工程中uint8变量文件比uint32变量文件大4字节的问题排查

前言 (1)如果有嵌入式企业需要招聘湖南区域日常实习生,任何区域的暑假Linux驱动实习岗位,可C站直接私聊,或者邮件:zhangyixu02gmail.com,此消息至2025年1月1日前均有效 (2&#xff0…

QCustomPlot(一)设置环境

1 设置QCustomPlot环境 将QCustomPlot与你的应用程序配合使用非常简单: 从下载部分获取最新版本的QCustomPlot。 像使用其他普通的类文件一样,使用qcustomplot.h和qcustomplot.cpp文件。 1.1 QtCreator用户 在左侧边栏中右键单击项目的根目录条目&a…

小程序js常用工具及请求关键代码的封装

一个js常用工具及请求关键代码的封装随着时间变迁。 一 2017年 第一版web管理后台在用 web后台管理页面用 /*** Created by hua on 2017/8/24.*/ var requestResult{success :0,failure:1,failureMsg:2 }jx{reqAjax:function (isSync,url,fnSuccess,fnFailure) {$.ajax({typ…

向日葵远程控制软件MySQL5.7的安装与配置

目录 一. 向日葵远程控制软件 1.1 简介 1.2 选择原因 1.3 安装及使用 1.4 使用场景 二. MySQL5.7 安装与配置 2.1 什么是MySQL 2.2 安装 MySQL5.7 2.2.1 安装步骤 2.2.2 内部连接 2.2.3 外部连接 三. 思维导图 一. 向日葵远程控制软件 1.1 简介 向日葵电脑版是一款拥有多年…

智能化校园:深入探讨云端管理系统设计与实现(一)

推荐阅读 轻松驾驭JDBC:一篇文章帮你搞定数据库连接 ChatGPT爆火一周年,快来拥有专属你的ChatGPT应用! 文章目录 推荐阅读智慧校园云端管理系统的设计和实现项目简介项目技术栈项目功能项目开发项目搭建修改pom.xml文件项目包结构配置applic…

element-ui Tree 树形控件 过滤保留子级并获取过滤后的数据

本示例基于vue2 element-ui element-ui 的官网demo是只保留到过滤值一级的&#xff0c;并不会保留其子级 目标 1、Tree 树形控件 保留过滤值的子级 2、在第一次过滤数据的基础上进行第二次过滤 先看效果 Tree 树形控件 保留过滤值的子级 <el-treeclass"filter-t…

Redis(中)

1、redis的持久化 "Redis 如何将数据写入磁盘"&#xff0c;首先要明白的时候&#xff0c;我们使用的redis的数据保存在内存上的&#xff0c;也就是说&#xff0c;只要我们的电脑关机或者重启服务器&#xff0c;那么在内存中的数据就会消失&#xff0c;所以要想持久化…

网络四元组

文章目录 网络四元组 今天我们来聊聊 网络四元组 网络四元组 四元组&#xff0c;简单理解就是在 TCP 协议中&#xff0c;去确定一个客户端连接的组成要素&#xff0c;它包括源 IP 地址、目标 IP 地址、源端口号、目标端口号。 正常情况下&#xff0c;我们对于网络通信的认识可…

2024,这将是量子计算的真正挑战

2023年&#xff0c;一项项量子计算纪录被打破。 谷歌量子AI团队证明了将多个量子比特分组合成为一个逻辑量子比特的纠错方法可以提供更低的容错率。以往的纠错研究随着比特数的增加&#xff0c;错误率会提高&#xff0c;都是“越纠越错”&#xff0c;而这次谷歌首次实现了“越纠…

Vue3 结合typescript 组合式函数

在App.vue文件中 实现鼠标点击文件&#xff0c;显示坐标值 第一种方法 第二种方法&#xff1a;组合式函数 结果&#xff1a; 官网推荐组合函数&#xff1a;https://vueuse.org

[讲座] - 闲聊工业设计

1&#xff0c;工业设计相关的学科分类 2&#xff0c;工业设计的职业发展路线 3&#xff0c;工业设计师的成名人物 4&#xff0c;设计了可口可乐的Loewy 可口可乐的瓶子&#xff0c;无论白天晚上还是瓶子被打碎&#xff0c;都能认出这个是可口可乐的瓶子。 草图参照了可可豆&am…

项目引入Jar包的几种方式

目录 背景 方式一 前提 创建一个jar包 使用 方式二 背景 通常情况下&#xff0c;使用SpringBoot框架开发项目的过程中&#xff0c;需要引入一系列依赖&#xff0c;首选的就是在项目的 pom.xml 文件里面通过Maven坐标进行引入&#xff08;可以通过Maven的坐标引入jar包的前…