Head First设计模式(阅读笔记)-07.适配器模式
创始人
2024-03-03 19:41:03
0

火鸡冒充鸭子

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


// 鸭子接口
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 设计模式-适配器模式

设计模式-适配器模式

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...