5、设计模式之适配器模式/原型模式

文章目录

  • 开始之前
  • 适配器模式
    • 使用场景
    • 注意事项
    • 何时使用
    • 优缺点
    • 代码实现
  • 原型模式
    • 深拷贝和浅拷贝

开始之前

本章节是一个系列,里面用的的代码实例都是连贯的。在实现某一种设计模式时,为了减少代码篇幅,前面博客出现model类(仅限公用的model类,比如compute、CPU、Mem、Disk等纯对象类)不会重复出现,读者在阅读某一篇博客时,如果发现突然出现了一个新的model类,在本片博客中没有其定义,可以往前面的博客翻一下!

最后,当本系列更新完成后,我会整个的代码完整贴出来,提供下载链接!

适配器模式

使用场景

有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项

适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

何时使用

1、系统需要使用现有的类,而此类的接口不符合系统的需要。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

优缺点

优点:

  • 1、可以让任何两个没有关联的类一起运行。
  • 2、提高了类的复用。
  • 3、增加了类的透明度。
  • 4、灵活性好。

缺点:

  • 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。
    比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,
    一个系统如果太多出现这种情况,无异于一场灾难。
    因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
  • 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

代码实现

现在在之前代码的基础上,之前compute只能读写磁盘Disk,现在想要能够适配读写SD卡。

public abstract class SDCard {protected abstract String getName();public void readSD(){System.out.println(getName()+" readSD");}public void writeSD(){System.out.println(getName()+" writeSD");}
}public class XiaomiSDCard extends SDCard{@Overrideprotected String getName() {return "xiao mi sdcard";}
}

适配器需要继承已有的disk类,然后适配新的SD卡类

public class SDCardAdapter extends Disk {private final SDCard sdCard;public SDCardAdapter(SDCard sdCard) {this.sdCard = sdCard;}@Overrideprotected String getName() {return "sd card adapter";}@Overridepublic void read() {sdCard.readSD();}@Overridepublic void write() {sdCard.writeSD();}
}
public class Client {public static void main(String[] args) {System.out.println("正常模式");Compute compute = new ComputeBuilder().power(new V220()).mem(new XiaomiMem()).cpu(new XiaomiCpu()).disk(new XiaomiDisk())//需要适配的地方.build();compute.run();System.out.println("适配器模式");compute = new ComputeBuilder().power(new V220()).mem(new XiaomiMem()).cpu(new XiaomiCpu()).disk(new SDCardAdapter(new XiaomiSDCard()))//适配器模式.build();compute.run();}
}

原型模式

定义:通过复制现有实例来创建新的实例,无需知道相应类的信息。
简单地理解,其实就是当需要创建一个指定的对象时,我们刚好有一个这样的对象,但是又不能直接使用,我会clone一个一毛一样的新对象来使用;基本上这就是原型模式。关键字:Clone。

深拷贝和浅拷贝

浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。
深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。clone明显是深复制,clone出来的对象是是不能去影响原型对象的

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

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

相关文章

【LabVIEW FPGA入门】同步C系列模块

1.同步使用循环定时器VI计时循环速率的系列模块 数字模块SAR ADC 模块多路复用模块 数字通道可以在一个时钟周期内执行。模拟通道需要多个时钟周期。 同步模拟模块的每个通道有一个 ADC,采集的数据在通道之间没有明显的偏差。多路复用模块使用多路复用器通过单个 A…

Docker安装并部署Gitlab,同时解决Gitlab服务经常503/500的问题

文章目录 Docker 安装Gitlab部署后需要解决的小问题1. 获取初始密码2. 解决刚安装好的Gitlab频繁出现503/500并重启的错误 Docker 安装Gitlab docker pull gitlab/gitlab-cedocker run -d -p 11443:443 -p 11090:80 -p 11022:22 \ --name gitlab \ --restart unless-stopped \…

深入理解NumPy与Pandas【numpy模块及Pandas模型使用】

二、numpy模块及Pandas模型使用 numpy模块 1.ndarray的创建 import numpy as np anp.array([1,2,3,4]) bnp.array([[1,2,3,4],[5,6,7,8]]) print(a) #[1 2 3 4] print(b) #[[1 2 3 4][5 6 7 8]] 1.1使用array()函数创建 numpy.array(object, dtype None, copy True, ord…

vue2和vue3区别

Vue 3是Vue.js框架的下一代主要版本,它在2020年9月正式发布。Vue 3带来了一系列的新特性和改进,包括性能提升、更小的打包尺寸、更好的TypeScript支持、新的组合式API等。以下是Vue 2和Vue 3之间的一些主要区别: 1. 性能提升: …

计算机存储单位

目录 是什么 存储单位的划分 存储单位转换关系表 相关疑问 存储单位转换除了位之外的存储单位转换规则是什么 为什么在编码中最小的操作单位不是位 是什么 用来度量数据存储容量的单位。 存储单位的划分 存储单位有 位(bit,也称为比特&#xff…

光伏项目怎么做预算?

随着可再生能源行业的蓬勃发展,光伏行业也得到了扩张。许多想要加入光伏项目投资的人,都在为怎样为项目做预算而苦恼,今天我就来跟大家分析下可以怎么做。 一、了解市场需求,确定预算目标 在制定光伏项目预算方案之前&#xff0c…

《SpringBoot》系列文章目录

SpringBoot是由Pivotal团队提供的全新框架,旨在简化新Spring应用的初始搭建以及开发过程。以下是一些关于SpringBoot的详细介绍: 设计目的:SpringBoot通过特定的方式来进行配置,使得开发人员不再需要定义样板化的配置&#xff0c…

「贪心算法」将数组和减半的最少操作次数

力扣原题链接,点击跳转。 给你一个数组,每次可以把其中一个数减半,可以对同一个数多次减半。至少操作多少次,才能让数组的和整体减少至少一半呢? 我们每次都选择当前数组中最大的那个数减半,就能减少最多…

链路初始化和训练

一、总览 链路初始化和训练,由物理层进行控制,是一个基于硬件的过程。初始化设备的链路和端口,使得设备能够收发报文,在链路上正常通信。 在reset后由硬件自动启动完整的训练过程,并由LTSSM管理。 1 位锁定 训练开始…

【Vue】diff 算法

diff的时机 当组件创建时,以及依赖的属性或数据变化时,会运行一个函数,该函数会做两件事: 运行_render生成一棵新的虚拟dom树(vnode tree),返回根节点运行_update,传入虚拟dom树的根节点,对新旧…

typedef定义结构体包含函数指针的巨坑

起因 尝试在c中模仿c的类,把成员函数放置到结构体中。显然只能放置一个结构体指针。 于是准备这么做。 错误示范 typedef struct {int id;void(*show)(Person p); }Person;void showPerson(Person p){ //.... }void init(Person * p){p->show showPerson; …

犀牛8 for Mac/Win:重塑三维建模的新标杆

在数字创意的浪潮中,犀牛8(Rhinoceros 8)作为一款卓越的三维建模软件,以其强大的功能和出色的性能,在Mac和Windows平台上都赢得了广大设计师和工程师的青睐。 犀牛8不仅继承了前代产品的优秀基因,更在细节…

基于python+Django+opencv的疲劳检测系统设计与实现

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

Nginx的集群负载均衡(nginx构建tomcat集群案例)

一 .Nginx的集群负载均衡 1.nginx 集群负载均衡示意图 2.四层负载均衡和7层负载均衡 LVS 四层负载均衡(常用); Haproxy四层负载均衡;Nginx 四层负载均衡; Haproxy七层负载均衡;Nginx 七层负载均衡(常用); 3.nginx构建tomcat集群 步骤1:安装tomcat 步骤2:nginx配置tom…

夸夸生肖属鼠的女性朋友

属鼠人一生的命运受到许多因素的影响,包括性格、家庭、教育、环境等。属鼠人性格外向、求知欲强、善解人意、善于结交各种各样的朋友,有丰富的人脉,容易得到他人的帮助和支持。 属鼠的人聪明、机智,他们善于观察,富有…

MySQL(七) 表的内连和外连

表的连接分为内连和外连 9.1 内连接 内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我们前面学习的查询都是内连接,也是在开发过程中使用的最多的连接查询。 语法: select 字段 from 表1 inner join 表2 on 连接条件 and …

【代码随想录】面试常考类型之动态规划基础题目

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记,为了之后方便观看 做题步骤 含义公式初始化顺序检查 确定dp数组以及下标的含义递推公式dp数组如何初始化遍历顺序打印dp数组(看哪里有问题) 斐波那契数 …

MFC:CFileFind类使用方法介绍

这是一个介绍MFC中CFileFind类的小程序。编写这个程序使用的编辑软件是VS2022&#xff0c;基于C空项目。在C空项目下要调用MFC类需要&#xff1a;首先&#xff0c;头文件要包含<afx.h>&#xff0c;这个头文件包含了绝大部分使用MFC所需头文件&#xff1b;其次&#xff0c…

在线改图片怎么做更简单?快速修改图片尺寸的方法

现在一般拍摄出的图片尺寸都会比较大&#xff0c;想要上传大网上的一些平台展示时&#xff0c;经常会受到平台的限制&#xff0c;无法将图片正常上传到平台&#xff0c;那么如何将图片尺寸快速调整呢&#xff1f;比较简单的一种方式&#xff0c;可以通过在线改图片的工具来实现…

一个开源的个人主页模板,可以通过 Github Actions 来进行自动构建。

無名の主页 简单的小主页&#xff0c;原来的看够了&#xff0c;重新弄了一个 主页的 Logo 字体已经过压缩&#xff0c;若用本站 Logo 以外的字母会变回默认字体&#xff0c;这里是 完整字体&#xff0c;若无法下载&#xff0c;可将字体目录下的 Pacifico-Regular-all.ttf 进行替…