面向对象设计模式:结构型模式之适配器模式

news2025/7/19 3:51:12

一、引入

在这里插入图片描述

  • Object Oriented Adapters
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

二、XX 模式

aka:Wrapper (包装器)

2.1 Intent 意图

  • Convert the interface of a class into another interface clients expect. 将一个类的接口转换成客户希望的另外一个接口.
    • 作为两个不兼容的接口之间的桥梁
  • 适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

2.2 Applicability 适用性

  • You want to use an existing class, and its interface does not match the one you need.
  • you want to create a reusable class that cooperates with unrelated or unforeseen classes, that is, classes that don’t necessarily have compatible interfaces.
  • (object adapter only,仅对象适配器) you need to use several existing subclasses, but it’s impractical to adapt their interface by subclassing every one. 需要使用几个现有的子类,但是通过对每个子类进行子类化来适配它们的接口是不切实际的。
    • An object adapter can adapt the interface of its parent class. 对象适配器可以适配其(所有子类)父类的接口.

2.3 类图

  • 类适配器:多继承(not for java)、多实现
  • 对象适配器:关联,依赖组合

在这里插入图片描述

  • Client: Collaborates with objects conforming to the Target interface. 与符合目标接口的对象进行协作
  • Target: Defines the domain-specific interface that Client uses, It should be an interface. 定义 Client 使用的特定领域的接口,它应该是一个接口
  • Adaptee: Defines an existing interface that needs adapting, could be an interface, or abstract class, or class. 定义需要适配的现有接口,Adaptee 可以是接口、抽象类或类
  • Adapter: Adapts the interface of Adaptee to the Target interface. 适配 Adaptee 的接口到目标接口

2.4 实例:鸭子与火鸡

鸭子与火鸡:
If it walks like a duck and quacks like a duck, then it might be a turkey wrapped with a duck adapter
如果它像鸭子一样走路,那么它可能是一只带着鸭子适配器的火鸡

  • 鸭子
public interface Duck {
	public void quack();

	public void fly();
}
public class MallardDuck implements Duck {
	public void quack() {
		System.out.println("Quack");
	}

	public void fly() {
		System.out.println("I'm flying");
	}
}

  • 火鸡
public interface Turkey {
	public void gobble();

	public void fly();
}
public class WildTurkey implements Turkey {
	public void gobble() {
		System.out.println("Gobble gobble");
	}

	public void fly() {
		System.out.println("I'm flying a short distance");
	}
}
  • 火鸡适配器:适配火鸡接口
public class TurkeyAdapter implements 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 DuckTestDrive {
	public static void main(String[] args) {
		MallardDuck duck = new MallardDuck();

		WildTurkey turkey = new WildTurkey();
		Duck turkeyAdapter = new TurkeyAdapter(turkey);

		System.out.println("The Turkey says...");
		turkey.gobble();
		turkey.fly();

		System.out.println("\nThe Duck says...");
		testDuck(duck);

		System.out.println("\nThe TurkeyAdapter says...");
		testDuck(turkeyAdapter);
	}

	static void testDuck(Duck duck) {
		duck.quack();
		duck.fly();
	}
}

在这里插入图片描述

  • 鸭子适配器:适配鸭子
public class DuckAdapter implements Turkey {
	Duck duck;
	Random rand;

	public DuckAdapter(Duck duck) {
		this.duck = duck;
		rand = new Random();
	}

	public void gobble() {
		duck.quack();
	}

	public void fly() {
		if (rand.nextInt(5) == 0) {
			duck.fly();
		}
	}
}
public class TurkeyTestDrive {
	public static void main(String[] args) {
		MallardDuck duck = new MallardDuck();
		Turkey duckAdapter = new DuckAdapter(duck);

		for (int i = 0; i < 10; i++) {
			System.out.println("The DuckAdapter says...");
			duckAdapter.gobble();
			duckAdapter.fly();
		}
	}
}

在这里插入图片描述


在这里插入图片描述

2.5 实例:适配枚举到迭代器

The early collections types (Vector, Stack, Hashtable, and a few others) implement a method elements(), which returns an Enumeration.

Adapting an Enumeration to an Iterator.

  • Target:Iterator
  • Adaptee:Enumeration
  • Adapter:EnumerationIterator
@SuppressWarnings("unchecked")
public class EnumerationIterator implements Iterator {
	Enumeration enumeration;
 
	public EnumerationIterator(Enumeration enumeration) {
		this.enumeration = enumeration;
	}
 
	public boolean hasNext() {
		return enumeration.hasMoreElements();
	}
 
	public Object next() {
		return enumeration.nextElement();
	}
 
	public void remove() {
		throw new UnsupportedOperationException();
	}
}
public class EnumerationIteratorTestDrive {
	@SuppressWarnings("unchecked")
	public static void main (String args[]) {
		// Vector v = new Vector(Arrays.asList(args));
		Vector v = new Vector(Arrays.asList("A", "B", "C", "E", "F", "G"));
		Iterator iterator = new EnumerationIterator(v.elements());
		while (iterator.hasNext()) {
			System.out.println(iterator.next());
		}
	}
}

以迭代器形式遍历枚举。

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

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

相关文章

Leetcode.1359 有效的快递序列数目

题目链接 Leetcode.1359 有效的快递序列数目 Rating &#xff1a; 1723 题目描述 给你 n笔订单&#xff0c;每笔订单都需要快递服务。 请你统计所有有效的 收件/配送 序列的数目&#xff0c;确保第 i 个物品的配送服务 delivery(i)总是在其收件服务 pickup(i)之后。 由于答案…

Locally Differentially Private Protocols for Frequency Estimation论文笔记

文章目录1.Pure LDP Protocol1.1相关背景1.2支持集1.3相关定义2.Basic one-time RAPPOR3.Rappor4.Direct Encoding4.1GRR4.2RR5.Unary Encoding5.1Symmetric Unary Encoding5.1Optimized Unary Encoding6.Local Hashing6.1Binary Local Hashing6.2Local Hashing6.3Optimal Loca…

Java后端实现Excel导入和导出

文章目录前言1.1准备1.2 Excel导入1.2.1 解析为JSON1.2.2 解析为对象&#xff08;基础&#xff09;1.2.3 解析为对象&#xff08;字段自动映射&#xff09;1.2.4 解析为对象&#xff08;获取行号&#xff09;1.2.5 解析为对象&#xff08;获取原始数据&#xff09;1.2.6 解析为…

JavaScript 条件语句 If ... Else实例集合

文章目录JavaScript 条件语句 If ... Else实例集合If 语句If...else 语句随机链接Switch 语句JavaScript 条件语句 If … Else实例集合 If 语句 源码 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>梁辰兴实例</t…

stack_queue

目录&#xff1a;stack的介绍stack的使用stack的模拟实现queue的介绍queue的使用queue的模拟实现容器适配器是什么priority_queue的介绍priority_queue的使用priority_queue的模拟实现为什么要引“#include<functional>”头文件&#xff1f;回调函数仿函数stack的介绍 s…

无线蓝牙耳机佩戴舒适的有哪几款?入耳舒适的蓝牙耳机推荐

耳机已经成了现代年轻人不可缺少的东西&#xff0c;选择一款佩戴舒适的蓝牙耳机&#xff0c;使人幸福感爆棚&#xff0c;并且还能感受导音质出色声音表现力&#xff0c;下面整理了几款入耳舒适的耳机。 一、南卡小音舱蓝牙耳机 单耳重量&#xff1a;3.1g 佩戴类型&#xff1a…

FISCO BCOS(二十八)———使用java SDK与区块链交互

一、基本环境准备 1、部署配置jdk1.8 https://blog.csdn.net/weixin_46457946/article/details/1232435132、搭建单群组FISCO BCOS联盟链 https://blog.csdn.net/weixin_46457946/article/details/1225463343、配置及使用控制台 https://blog.csdn.net/weixin_46457946/art…

Vue2的基本使用

一、vue的基本使用 第一步 引入vue.js文件 <script src"https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script> 或者<script src"./js/vue.js"></script> 第二步 在body中设置一个挂载点 {{msg}} <div id"app…

Web3中的营销:如何在2023年获得优势

Mar. 2022, Daniel在过去的一年里&#xff0c;让人们对你的Web3项目或协议感兴趣已经变得越来越有挑战性。许多曾经充满希望的项目因为各种不同的原因&#xff0c;都在熊市中倒下了。然而&#xff0c;那些迄今为止幸存下来的项目都有一个共同点&#xff1a;强大的社区。Web3营销…

九龙证券“风光储锂芯”集体回暖 创业板指探低回升

周一&#xff0c;A股三大指数体现分解&#xff0c;沪指微跌&#xff0c;创业板指探低上升小幅上涨。盘面上&#xff0c;“风景储锂芯”集体反弹&#xff0c;6G概念再度大涨&#xff0c;消费股午后逆势走强&#xff0c;酒店旅游方向领涨&#xff0c;而前期热门的数字经济概念震动…

OpenCV实战(13)——高通滤波器及其应用

OpenCV实战&#xff08;13&#xff09;——高通滤波器以及应用0. 前言1. 检测图像边缘1.2 Sobel 滤波器1.2 梯度算子1.3 高斯导数2. 图像拉普拉斯算子2.1 拉普拉斯算子2.2 使用拉普拉斯算子增强图像的对比度2.3 高斯差3. 完整代码小结系列链接0. 前言 在频域分析中&#xff0c…

谷歌霸屏外推技术原理,谷歌留痕霸屏怎么做?

首先&#xff0c;让我解释一下谷歌霸屏外推技术原理 谷歌霸屏外推是指拥有一批网站资源&#xff0c;这些网站旨在通过搜索引擎优化技术提高排名&#xff0c;并将流量引导到主要网站。 这些网站通常具有相似的设计和内容&#xff0c;但使用不同的域名和IP地址。 如果您想通过…

C++中的谓词、空指针与野指针、内存四区、引用的详细介绍——C++学习记录05

文章目录1. 谓词2. 空指针与野指针3. 指针常量、常量指针与常量指针常量4.内存四区4.1 代码区&#xff1a;存放函数体的二进制代码4.2 全局区&#xff1a;4.3 栈区&#xff1a;4.4 堆区&#xff1a;5. 引用5.1基本定义5.2 引用做形参5.3 引用的本质5.4 常量引用1. 谓词 定义&a…

人群聚众行为识别系统 yolov5

人群聚众行为识别系统通过yolov5网络模型AI视频智能分析技术&#xff0c;人群聚众行为识别算法对现场人群聚众行为全天候监测&#xff0c;发现异常情况立即抓拍告警。我们选择卷积神经网络YOLOv5来进行人群聚众行为识别检测。6月9日&#xff0c;Ultralytics公司开源了YOLOv5&am…

自学c语言,有什么好的建议或方法吗?

不管背景如何&#xff0c;你都可能有以下4样技能有待提高。 读写能力 如果你平时使用IDE的话&#xff0c;尤其如此。不过大体来说我发现程序员略读的时候太多了&#xff0c;从而导致理解性阅读能力有些问题。他们将代码扫视一遍就觉得自己读懂了&#xff0c;其实不然。其他编…

数组链表【leetcode】

笔记&#xff1a;代码随想录数组概念存放在连续内存空间上相同类型数据的集合&#xff08;内存地址、字符数组、下标&#xff09;。特点数组元素不能删除&#xff0c;只能覆盖&#xff08;因为数组元素在内存中是连续的&#xff09;方法1.二分法条件&#xff1a;&#xff08;1&…

10.Clickhouse 单机部署

Clickhouse 单机部署 注意事项&#xff1a; 下载地址&#xff1a;https://packages.clickhouse.com/选择stable目录下的安装包&#xff0c;分别是这几个文件名(下面安装用的是 21.9.6.24 版本)&#xff1a;ClickHouse相关目录:1.命令目录 /usr/bin ll |grep clickhouse2.配置…

Windows安装RabbitMQ详细教程

一、RabbitMQ是什么&#xff1f;RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 ​ AMQP &#xff1a;Advanced Message Queue&#xff0c;高级消息队列协议。它是应用层协议的一个开放标准&#xff0c;为面向消息的中间件设计&#xff0c;基于此协议的客户端与消息中…

FJWC2019 Day2 题解

T1 - 直径 思路 就类似下图的链接方法。 这其中每一条边权都是 111。 我们设以 222 为根的子树除去 222 有 aaa 个节点&#xff0c;以 333 为根的子树除去 333 有 bbb 个节点&#xff0c;以 444 为根的子树除去 444 有 ccc 个节点。 此时直径的数量就为 a⋅ba⋅cb⋅ca\cdot…

Day910.中台是什么 -SpringBoot与K8s云原生微服务实践

中台是什么 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于中台是什么的内容。 近几年针对软件开发领域&#xff0c;中台&#xff0c;这词相信大家都不会陌生。 中台&#xff08;Technology Middle Platform&#xff09;是一种基于技术架构和业务架构的中间层&…