Head First设计模式(阅读笔记)-07.适配器模式

news2024/11/30 5:00:27

火鸡冒充鸭子

现在缺少一个绿头鸭对象,需要用野生火鸡对象冒充一下,但是二者的接口都不一样该怎么去冒充呢?


// 鸭子接口
public interface Duck{
	public void quack();  // 呱呱叫
    public void fly();  // 飞行
}
// 火鸡接口
public interface Turkey{
    public void gobble();  // 咯咯叫
    public void fly();  // 飞行
}
// 野生火鸡
public class WildTurkey implements Turkey{
	public void gobble(){
    	System.out.println("gobble");
    }
    public void fly(){
    	System.out.println("short flying"); 
    }
}

写个适配器


public class TurkeyAdapter implements Duck{  // 实现目标接口(因为想要一个鸭子对象,所以要实现Duck接口)
    Turkey turkey;  // 火鸡就是被适配的接口,使用组合的方式
    public TurkeyAdapter(Turkey turkey){  // 获取到被适配的对象引用
        this.turkey = turkey;
    }
    public void quack(){
        turkey.gobble();  // 暂且用火鸡的叫声冒充一下鸭子的叫声
    }
    public void fly(){
        for(int i = 0; i < 5; i++){
            turkey.fly();  // 鸭子能飞挺久,火鸡飞的时间短就多飞几次
        }
    }
}

测试适配器


public class DuckTest{
    public static void main(String[] args){
        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey);  // 开始冒充
        // 还是和鸭子一样能调用相应的方法,冒充成功
        turkeyAdapter.quack();
        turkeyAdapter.fly();
    }
}

适配器模式

  • 适配器模式将一个类的接口转换为客户期望的另一个接口,也就让原本接口不兼容的类可以合作
  • 将适配器模式类推到上述火鸡鸭子例子,如下图所示:

在这里插入图片描述

  • 客户使用适配器的流程:
    • 客户通过目标接口调用适配器的方法
    • 适配器使用被适配者接口把请求转换为被适配者的一/多个接口
    • 客户接收到调用结果时并不知道适配器进行了转换
    • 客户和被适配者是解耦的,它们之间并不知道对方

在这里插入图片描述


从枚举适配到迭代器

在早期的Java集合类型中存在一个Enumeration接口,其中有hashMoreElementsnextElement方法,而在更新后的Java集合类中开始使用Iterator接口,其中的方法是hashNextnextremove,现在希望在新代码中只使用迭代器,该如何实现?


设计适配器


public class EnumerationIterator implements Iterator{  // Iterator是目标接口
    Enumeration enum;  // Enumeration就是被适配的接口,使用组合的方式
    public EnumerationIterator(Enumeration enum){
        this.enum = enum;
    }
    public boolean hasNext(){  // 委托给enum的hashMoreElements方法
        return enum.hashMoreElements();
    }
    public Object next(){
        return enum.nextElement();  // 同理
    }
    public void remove(){
        return new UnsupportedOperationException();  // 无法支持,只能抛个异常
    }
}

参考

Head First 设计模式-适配器模式

设计模式-适配器模式

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

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

相关文章

应力奇异,你是一个神奇的应力!

在用ANSYS进行压力容器应力分析计算的时候&#xff0c;总会出现一些应力集中的问题&#xff0c;而且&#xff0c;有些应力集中点竟然没办法采用倒圆角的办法消除&#xff0c;采用网格加密方法时&#xff0c;甚至应力值比之前更大。这个情况&#xff0c;大家通常称为应力奇异。 …

springboot-mybatisplus-redis二级缓存

前言 mybatis可以自己带有二级缓存的实现&#xff0c;这里加上redis是想把东西缓存到redis中&#xff0c;而不是mybaits自带的map中。这也就构成了我们看到的springboot mybatisplus redis实现二级缓存的题目。 具体步骤如下&#xff1a; 首先加入需要的依赖 <dependenc…

《InnoDB引擎六》InnoDB 1.0.x版本之前的Master Thread

Master Thread 工作方式 在后台线程中提到&#xff0c;Master Thread是核心的后台线程。InnoDB存储引擎的主要工作都是在一个单独线程中完成的。 InnoDB 1.0.x版本之前的Master Thread Master Thread具有最高的线程优先级别。内部由多个循环组成&#xff1a;主循环(loop)、后台…

[附源码]SSM计算机毕业设计医院仪器设备管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于萤火虫算法优化的BP神经网络预测模型(Matlab代码实现)

目录 1 概述 2 萤火虫算法 3 萤火虫算法优化BP神经网络的算法设计 3.1 基本思想 3.2 萤火虫算法优化BP神经网络算法 4 运行结果 5 参考文献 6 Matlab代码及文章 1 概述 现实的世界中混沌现象无处不在,大至宇宙,小到基本粒子,都受到混沌理论支配.如气候变化会出 现混沌…

(三)DepthAI-python相关接口:OAK Nodes

消息快播&#xff1a;OpenCV众筹了一款ROS2机器人rae&#xff0c;开源、功能强、上手简单。来瞅瞅~ 编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查…

[MySQL]-压力测试_TPCC-MySQL

[MySQL]-压力测试_TPCC-MySQL 森格 | 2022年10月 对数据库学习来说&#xff0c;压力测试也是十分必要的一环&#xff0c;本文章主要介绍了TPCC-MySQL这个工具的使用。 一、基本概念 1.1 基准测试VS压力测试 基准测试&#xff1a; 直接简单、易于比较&#xff0c;用于评估服务…

CAD必练图形

这次我们用CAD梦想画图软件绘制一个CAD新手必练图形&#xff0c;它用到的有CAD矩形、直线、圆弧、等分等命令结合起来完成绘制的&#xff0c;可以跟着一起操作一下。 目标图形 操作步骤 1.使用CAD矩形命令&#xff08;快捷键&#xff1a;REC&#xff09;绘制一个长80宽30的矩…

为什么macbook不能删除u盘里东西?苹果电脑如何删除u盘文件

为什么macbook不能删除u盘里东西&#xff1f;有时候&#xff0c;我们会发现U盘不能够在Mac上正常使用&#xff0c;只能够读取U盘上的文件数据&#xff0c;但是若想要对其进行删除或者是编辑操作&#xff0c;完全不能够实现&#xff0c;本文为大家详细介绍了不同情况的不同解决方…

云原生主题学习月|共同学习全球领先的亚马逊云科技云原生课程,组团共学拿奖励~

CSDN 已上线亚马逊云科技超过 60 门中文数字化培训课程&#xff0c;希望为学习者提供亚马逊云科技基础技能知识和最佳实践。 每门课程时长从十分钟到几小时不等&#xff0c;由亚马逊云科技专家打造&#xff0c;其中包括最受欢迎的《亚马逊云科技云从业者必修知识》&#xff0c…

vue3发送验证码倒计时 (防止连点、封装复用)

一、实现思路 倒计时 流程图二、实现一个简单的验证码倒计时 //倒计时初始变量 const codeNum ref(60); // 定时器id let clearId: number; // 发送验证码 const sendCode async () > { // 防止下次点击 如果倒计时的时间不是60 就不执行下面逻辑if (codeNum.value ! 60)…

AcWing算法学习第三节---高精度问题.

系列文章目录 第一节快速排序 第二节二分法 学习路上的风景&#xff0c;我陪你一起去看&#xff0c;编程路上的算法&#xff0c;我陪你一起去学&#xff0c;朋友们你们好&#xff0c;我是夏目浅石&#xff0c;蟹蟹你点开文章和我一同进步&#xff0c;加油&#xff01;遇见更好…

2022Q3手机配件增长榜:手机壳、数据线等供求不断增加

本篇我们将继续来分析22年Q3季度中手机通讯行业的高增长概念。在手机通讯行业中&#xff0c;我们发现了3个高增长品类&#xff0c;分别是&#xff1a;手机耳机、手机壳、数据线。 一、手机配件类高增长概念——手机耳机 手机耳机可以分为不同种类&#xff0c;如&#xff1a;开放…

现代物流有哪些特点?

现代物流的特点有系统化、网络化、信息化、专用化和准时性和柔性化。 现代物流特点一&#xff1a;系统化 现代物流强调了物流体系是一个具有综合性和系统性的过程&#xff0c;以优化物流管理体系为目标&#xff0c;降低物流运营管理成本&#xff0c;实现企业效益提升&#xff0…

python笔记76-types.FunctionType 动态创建函数

前言 types.FunctionType 创建函数有2种方式&#xff1a; 从已有函数的基础上&#xff0c;创建一个新函数从一个compile 构建的函数对象上&#xff0c;创建一个新函数 FunctionType 使用 FunctionType 可以用于判断一个对象是不是函数 from types import FunctionType, Me…

中国互联网综合实力100强:猿辅导第39

11月2日&#xff0c;中国互联网企业综合实力指数发布会暨百家企业高峰论坛在厦门成功举办。发布会上&#xff0c;中国互联网协会正式发布了《中国互联网企业综合实力指数&#xff08;2022&#xff09;》以及2022年中国互联网综合实力前百家企业榜单。 北京猿力教育科技有限公司…

腾讯基础面

传送门1. 有了解过C吗&#xff1f;接受转语言吗&#xff1f;2. 有没有了解过一些框架的底层原理、底层优化、数据库的索引优化3. 了解过哪些Map&#xff0c;可以从底层简单说下嘛&#xff1f;4. 你项目中是如何去实现幂等性的&#xff1f;5. RPC的协议讲一讲&#xff0c;怎么处…

开源共建 | TIS整合数据同步工具ChunJun,携手完善开源生态

TIS整合ChunJun实操 B站视频&#xff1a; https://www.bilibili.com/video/BV1QM411z7w5/?spm_id_from333.999.0.0 一、ChunJun 概述 ChunJun是一款易用、稳定、高效的批流统一的数据集成框架&#xff0c;可基于实时计算引擎Flink实现多种异构数据源之间的数据同步与计算&…

MySQL日志管理、备份与恢复

文章目录一、mysql常用日志1、概述①、错误日志②、二进制日志③、中继日志④、慢查询日志⑤、通用查询日志&#xff0c;用来记录MySQL的所有连接和语句&#xff0c;默认是关闭的2、数据库中查询日志状态①、查看二进制日志开启状态②、查看慢查询日志功能是否开启③、查看慢查…

FPGA书籍

1、Xilinx FPGA 权威设计指南 本书系统地介绍了Xilinx新一代集成开发环境Vivado 2018的设计方法、设计流程和具体实现。 全书共11章&#xff0c;内容包括Xilinx新一代UltraScale结构、Vivado集成设计环境导论、Vivado工程模式基本设计实现、Vivado非工程模式基本设计实现、创建…