设计模式(13)适配器模式

news2025/1/13 10:48:29

一、介绍:

1、定义:是一种结构型设计模式,它可以将一个类的接口转换成客户端所期望的另一种接口。适配器模式常用于系统的不兼容性问题。

2、组成:

(1)目标接口(Target):客户端所期望的接口,适配器通过实现目标接口来对外提供服务。

(2)适配器(Adapter):将源接口转换成目标接口的类,它实现了目标接口,并且包含一个对源接口的引用。

(3)源接口(Adaptee):需要被适配的类,其接口与目标接口不兼容。

3、UML类图:

4、优缺点:

(1)优点:

更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能。
完美实现解耦,通过增加适配器类将适配者与目标接口联系起来,无需修改原有实现;
符合开闭原则

(2)缺点:会导致系统紊乱:滥用适配器,会让系统变得非常零乱。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

5、适配器模式有2种:面向类的适配器模式,面向对象的适配器模式。常说的是对象适配器。

二、demo:

1、类适配器模式:

//源:
 class Person {
        public void speakJapanese() {
            System.out.println("I can speak Japanese!");
        }

        public void speakEnglish() {
            System.out.println("I can speak English!");
        }
    }

//目标:
    interface Target {
        void speakJapanese();

        void speakEnglish();

        void speakFrench();
    }

//适配器:
    class Adapter extends Person implements Target {

        @Override
        public void speakFrench() {

        }
    }

2、对象适配器模式:把“源”作为一个对象聚合到适配器类中。

  //源  
 class Person {
        public void speakJapanese() {
            System.out.println("I can speak Japanese!");
        }

        public void speakEnglish() {
            System.out.println("I can speak English!");
        }
    }


    //对象
    interface Target {
        void speakJapanese();

        void speakEnglish();

        void speakFrench();
    }

    //适配器
    class Adapter implements Target {

        Person mPerson;

        public Adapter(Person person) {
            this.mPerson = person;
        }

        @Override
        public void speakJapanese() {
			 mPerson.speakJapanese();
        }

        @Override
        public void speakEnglish() {
			 mPerson.speakEnglish();
        }

        @Override
        public void speakFrench() {

        }
    }

3、接口适配器模式(缺省适配模式):

这种模式的核心归结如下:当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。

public interface Job {
	
	public abstract void speakJapanese();
	public abstract void speakEnglish();
	public abstract void speakFrench();
	public abstract void speakChinese();
	
}

public abstract class JobDefault implements Job{

	public void speakChinese() {
		
	}

	public void speakEnglish() {
		
	}

	public void speakFrench() {
		
	}

	public void speakJapanese() {
		
	}

}

public class JobImpl extends JobDefault{
	
	public void speakChinese(){
		System.out.println("I can speak Chinese!");
	}
	
}

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

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

相关文章

商品价格区间筛选

列表应用,商品价格区间筛选。 (本笔记适合熟悉python列表及列表的条件筛选的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅是基础那么…

允许mysql远程访问

一、修改表 进入mysql,mysql -u root ,如果没有root用户,那么是可以直接进入的 使用 mysql数据库 use mysql 执行 update user set host% where userroot; 查询 用户表 select User,Host from user 把root用户的host改为 % 允许任何主…

elment-ui 日期选择器 月份区间选择的问题解决(含代码、截图)

elment-ui 日期选择器 月份区间选择的问题解决(含代码、截图) 参考文章: elment-ui 日期选择器 月份区间选择的问题解决官方文档参考:https://element.eleme.cn/#/zh-CN/component/date-picker 效果图: 代码案例&…

赢球票(蓝桥杯)

赢球票 题目描述 某机构举办球票大奖赛。获奖选手有机会赢得若干张球票。 主持人拿出 N 张卡片(上面写着 1⋯N 的数字),打乱顺序,排成一个圆圈。 你可以从任意一张卡片开始顺时针数数: 1,2,3 ⋯ 如果数到的数字刚好和卡片上的…

东莞理工网安学院举办第三届“火焰杯”软件测试高校就业选拔赛颁奖典礼

3月7日下午,由软件测试就业联盟主办的第三届“火焰杯”软件测试高校就业选拔赛颁奖典礼在9A206报告厅举行。本届比赛我院有25位同学报名参加,预选赛阶段,有5位同学获奖。其中,一等奖1项,奖金价值10000元;二…

element-plus 自动按需引入icon unplugin-icons相关配置(有效)

1.安装的组件有这四个2.vite.config.js配置文件修改页面使用附完整vite.config.js配置 相关配置&#xff08;自行根据配置文件中的安装哈&#xff0c;我就不一 一列举了&#xff09; 1.安装的组件有这四个 2.vite.config.js配置文件修改 页面使用 <i-ep-edit />效果 附…

Linux操作系统使用及C高级编程

一、Linux介绍及环境配置 Linux介绍及环境配置 一、UNIX、LINUX和GNU简介 1、UNIX简介 2、Linux 1)操作系统内核软件操作系统 2&#xff09;操作系统内核-能统一的管理硬件了 3&#xff09;基于UNIX&#xff0c;UNIX不开源&#xff0c;对硬件要求专一&#xff0c;因此出现…

2023年【安全生产监管人员】考试题及安全生产监管人员考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【安全生产监管人员】考试题及安全生产监管人员考试内容&#xff0c;包含安全生产监管人员考试题答案和解析及安全生产监管人员考试内容练习。安全生产模拟考试一点通结合国家安全生产监管人员考试最新大纲及安…

【OpenCV实现图像的算数运算,性能测试和优化,改变颜色空间】

文章目录 OpenCV功能概要图像的算数运算性能测试和优化改变颜色空间对象追踪 OpenCV功能概要 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习库&#xff0c;提供了丰富的图像处理和计算机视觉算法。它支持多种编程语言&…

【C++入门:C++世界的奇幻之旅】

1. 什么是C 2. C发展史 3. C的重要性 4. C关键字 5. 命名空间 6. C输入&输出 7. 缺省参数 8. 函数重载 9. 引用 10. 内联函数 11. auto关键字(C11) 12. 基于范围的for循环(C11) 13. 指针空值---nullptr(C11)05. 1. 什么是C C语言是结构化和模块化的语言&…

HDR图像处理软件 Photomatix Pro mac中文版新增功能

Photomatix Pro mac是一款专业的HDR合成软件&#xff0c;可以将不同曝光的多张照片合成为一张照片&#xff0c;而保留更多的细节。并且合成时可以帮助去除照片中的鬼影。Photomatix Pro提供两种类型的过程来增加动态范围&#xff0c;一个过程称为HDR色调映射&#xff0c;另一个…

【MySQL】数据库常见错误及解决

目录 2003错误&#xff1a;连接错误1251错误&#xff1a;身份验证错误1045错误&#xff1a;拒绝访问错误服务没有报告任何错误net start mysql 发生系统错误 5。 1064错误&#xff1a;语法错误1054错误&#xff1a;列名不存在1442错误&#xff1a;触发器中不能对本表增删改1303…

SAFe敏捷发布火车ART案例分析-汽车公司里面的百人级团队

“Nothing beats an Agile Team&#xff0c; except a team of Agile Teams” ---SAFe 本案例来自于某汽车公司里一个百人级团队&#xff0c;该团队所开发功能是完全面向车主的&#xff0c;追求最佳用户体验。 01—转型前面临困难 在该团队启用SAFe ART之前&#xff0c;多个1…

欧拉筛(线性筛)算法的理解

欧拉筛&#xff08;Eulers Sieve&#xff09;(又叫线性筛)是一种用于生成素数的高效算法。与传统的试除法不同&#xff0c;欧拉筛通过线性时间复杂度来筛选出一定范围内的素数。这个算法以瑞士数学家莱昂哈德欧拉&#xff08;Leonhard Euler&#xff09;的名字命名&#xff0c;…

vue3使用Element ui plus中MessageBox消息框+radio框配合使用

想要达到的效果 首先安装element ui plus 省略~~ 官网地址&#xff1a; https://element-plus.gitee.io/zh-CN/component/message-box.htmlhttps://element-plus.gitee.io/zh-CN/component/message-box.html 需要用到的 引入 import { h } from "vue"; import {E…

Mac/Linux安装使用 opengauss数据库步骤

问题背景 一般部署opengauss数据库在虚拟机中&#xff0c;Mac使用虚拟机步骤较为繁琐&#xff0c;可以使用Docker部署opengauss数据库。Linux也可以使用此方式来部署opengauss数据库。 1. 在docker官网下载Docker桌面版&#xff0c;m系列芯片选Apple Chip。如果是Linux就下载…

vue项目内嵌iframe,iframe如何自适应高度

vue项目内嵌iframe&#xff0c;iframe如何自适应高度 一、直接上代码&#xff08;google版本的&#xff09;上面代码只处理了google&#xff0c;其他几个浏览器可以自行参考一下 一、直接上代码&#xff08;google版本的&#xff09; <iframeid"iframeContainer"s…

2023 uniapp( vue3 + TS )使用canvas生成海报并保存,taro/微信小程序也适用

有段时间没写vue了&#xff0c;有点生疏了...... 1、代码有注释&#xff0c;完整代码如下 <template><view class"page"><canvas class"canvas" v-if"isShow" :style"{width:${canvasWidth}px,height:${canvasHeight}px}&…

算法学习(四)将一颗二叉搜索树转排序的双向链表

描述 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 数据范围&#xff1a;输入二叉树的节点数 0 \le n \le 10000≤n≤1000&#xff0c;二叉树中每个节点的值 0\le val \le 10000≤val≤1000 要求&#xff1a;空间复杂度O(1)O(1)&#x…