设计模式6、适配器模式 Adapter

解释说明:将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
目标接口(Target):当前系统所期待的接口,它可以是抽象类或接口
适配者(Adaptee):它是被访问和适配的现存组件库中的组件接口
适配器(Adapter):它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者
从实现层面上划分,适配器模式分为两种:
类适配器(多继承方式)
对象适配器(对象组合方式)
那么,实际应用中如何在二者之间进行选择?
类适配器包含以下特点:
由于 Adapter 直接继承自 Adaptee 类,所以,在 Adapter 类中可以对 Adaptee 类的方法进行重定义。
如果在 Adaptee 中添加了一个抽象方法,那么 Adapter 也要进行相应的改动,这样就带来高耦合。
如果 Adaptee 还有其它子类,而在 Adapter 中想调用 Adaptee 其它子类的方法时,使用类适配器是无法做到的。
对象适配器包含以下特点:
有的时候,你会发现,去构造一个 Adaptee 类型的对象不是很容易。
当 Adaptee 中添加新的抽象方法时,Adapter 类不需要做任何调整,也能正确的进行动作。
可以使用多态的方式在 Adapter 类中调用 Adaptee 类子类的方法。
由于对象适配器的耦合度比较低,所以在很多的书中都建议使用对象适配器。在我们实际项目中,也是如此,能使用对象组合的方式,就不使用多继承的方式。
优点:
可以让任何两个没有关联的类一起运行
提高了类的复用
增加了类的透明度
灵活性好
缺点:
过多地使用适配器,会让系统非常零乱,不利于整体把控。
例如,看到调用的是 A 接口,内部却被适配成了 B 接口的实现,系统如果出现太多类似情况,无异于一场灾难。因此,如果不是很必要,可以不使用适配器,而是直接对系统进行重构。
适用场景
当想使用一个已存在的类,而它的接口不符合需求时。
你想创建一个可复用的类,该类可以与其他不相关的类或不可预见的类协同工作。
你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口,对象适配器可以适配它的父接口
适配器模式分为类适配器和对象适配器。
Jungle曾经在一个项目里多次使用了适配器模式。这里举个使用对象适配器模式的例子。
路径规划包括两个阶段:首先读取并解析工程图文件,得到其中的点、直线坐标;其次根据需求计算加工路径。软件控制器(Controller)上,系统点击“路径规划”按钮就自动完成上述过程。
Jungle已经封装好一个类DxfParser,该类可以读取后缀名为dxf的工程图文件,并解析其中的点、线,保存到路径列表里。另一个类PathPlanner用于计算加工路径
这个例子中,Controller就是目标抽象类,DxfParser和PathPlanner是适配者类,这两个类提供的方法可以用于实现路径规划的需求。我们只需再定义一个适配器类Adapter即可
#pragma once
#include <iostream>
using namespace std;
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
// 自带的充电器 - 两脚扁型
class OwnCharger
{
public:void ChargeWithFeetFlat() {cout << "OwnCharger::chargeWithFeetFlat" << endl;}
};
// 俄罗斯提供的插座
class IRussiaSocket
{
public:// 使用双脚圆形充电virtual void Charge() = 0;
};
// 电源适配器
class PowerAdapter : public IRussiaSocket
{
public:PowerAdapter() : m_pCharger(new OwnCharger()) {}~PowerAdapter() {SAFE_DELETE(m_pCharger);}void Charge() {//  使用自带的充电器(两脚扁型)充电m_pCharger->ChargeWithFeetFlat();}
private:OwnCharger* m_pCharger;  // 持有需要被适配的接口对象 - 自带的充电器
};#include "adapter.h"
int main()
{// 创建适配器IRussiaSocket* pAdapter = new PowerAdapter();// 充电pAdapter->Charge();SAFE_DELETE(pAdapter);getchar();return 0;
}

 

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

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

相关文章

AIGC(生成式AI)试用 7 -- 桌面小程序

生成式AI&#xff0c;别人用来写作&#xff0c;我先用来写个桌面小程序。 桌面小程序&#xff1a;计算器 需求 Python开发图形界面&#xff0c;标题&#xff1a;计算器 - * / 基本运算计算范围&#xff1a;-999999999 ~ 999999999** 乘方计算&#xff08;例&#xff0c;2*…

LLM之Colossal-LLaMA-2:Colossal-LLaMA-2的简介、安装、使用方法之详细攻略

LLM之Colossal-LLaMA-2&#xff1a;Colossal-LLaMA-2的简介、安装、使用方法之详细攻略 导读&#xff1a;2023年9月25日&#xff0c;Colossal-AI团队推出了开源模型Colossal-LLaMA-2-7B-base。Colossal-LLaMA-2项目的技术细节&#xff0c;主要核心要点总结如下: >> 数据处…

分布式事务-TCC异常-幂等性

1、幂等性问题&#xff1a; 二阶段提交时&#xff0c;如果二阶段执行成功通知TC时出现网路或其他问题中断&#xff0c;那么TC没有收到执行成功的通知&#xff0c;TC内部有定时器不断的重试二阶段方法&#xff0c;导致接口出现幂等性问题。 2、解决方法 和空回滚问题一样也是…

MATLAB中upsample函数用法

目录 语法 说明 示例 上采样离散时间传递函数 upsample函数的功能是上采样离散时间模型。 语法 sysl upsample(sys,L) 说明 sysl upsample(sys, L) 以比系统 sys 的采样时间&#xff08;Ts0&#xff09;快 L 倍的采样率重新对离散时间动态系统模型 sys 进行重新采样。…

Kotlin只截取Float小数点后数值DecimalFormat

Kotlin只截取Float小数点后数值DecimalFormat import java.text.DecimalFormatfun main(args: Array<String>) {val pi 3.141516Fvar p pi - pi.toInt()println(p)val decimalFormat DecimalFormat("00.0000")val format decimalFormat.format(p)println(…

UE5屏幕适配

一、本程序设计发布在手机上&#xff0c;首先确定屏幕的设计分辨率&#xff0c;这里我们选择iphone6s&#xff0c;750x1334。 二、设置DPI Scale为1.0的比例&#xff0c;点击齿轮标志 因为我们这个程序是手机竖屏使用的&#xff0c;所以DPI Scale Rule选择Shortest Side&#…

c语言常用语法,长时间不用容易忘。

关键字 auto 声明自动变量const 定义常量&#xff0c;如果一个变量被 const 修饰&#xff0c;那么它的值就不能再被改变extern 声明变量或函数是在其它文件或本文件的其他位置定义register 声明寄存器变量signed 声明有符号类型变量或函数static 声明静态变量&#xff0c;修饰…

APA技术架构与说明

1.自动泊车的硬件架构 2.APA自动泊车辅助系统 1&#xff09;APA主要包括以下典型功能 &#xff08;1&#xff09;泊车入库&#xff1a;利用超声波雷达或环视摄像头实现车位识别&#xff0c;并计算出合适行驶轨迹&#xff0c;对车辆进行横向/纵向控制使车辆驶入车位&#xff1…

在MyBatisPlus中添加分页插件

开发过程中&#xff0c;数据量大的时候&#xff0c;查询效率会有所下降&#xff0c;这时&#xff0c;我们往往会使用分页。 具体操作入下&#xff1a; 1、添加分页插件&#xff1a; package com.zhang.config;import com.baomidou.mybatisplus.extension.plugins.Pagination…

基于微信小程序的停车场预约收费小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

C++ 类和对象(7) 对象数组

和Stock一样&#xff0c;用户通常要创建同一个类的多个对象。可以创建独立对象变量&#xff0c;就像本章前面的示例所做的&#xff0c;但是创建对象数组将更合适。其实声明对象的方法与声明标准类型数组相同&#xff1a; Stock mysuff[4]; 当程序创建未被显式初始化的类对象时…

CCF CSP认证历年题目自练 Day15

CCF CSP认证历年题目自练 Day15 题目一 试题编号&#xff1a; 201709-1 试题名称&#xff1a; 打酱油 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   小明带着N元钱去买酱油。酱油10块钱一瓶&#xff0c;商家进行促销&#xf…

【运维日常】华为云专线实现idc通过nat出网

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

04、EL和JSTL核心技术

目录 1 EL表达式&#xff08;熟悉&#xff09; 1.1 基本概念 1.2 主要功能 1.3 访问内置对象的数据 1.3.1访问方式 1.3.2 执行流程 1.4 访问请求参数的数据 1.5 访问Bean对象的属性 1.5.1 访问方式 1.5.2 主要区别 1.6 访问集合中的数据 1.7 常用的内置对象 …

C++ 类和对象 (6)this指针

一般情况下&#xff0c;类中的成员函数在操作类中的一个对象&#xff0c;用这个类去创建一个对象&#xff0c;用对象去访问类的成员函数&#xff0c;无论怎么访问或操作&#xff0c;都是一个对象。但是有的时候类的成员函数可能会涉及两个对象&#xff0c;在这种情况下需要使用…

JVM111

JVM1 字节码与多语言混合编程 字节码 我们平时说的java字节码&#xff0c; 指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。不同的编译器&#xff0c;可以编译出相同的字节码文件&#xff0c;字节码文件…

Spring Security 简单token配置

Spring Security 简单token配置 说明&#xff1a;非表单配置 先上码&#xff1a; https://gitee.com/qkzztx_admin/security-demo/tree/master/demo-two 环境&#xff1a;win10 idea2023 springboot2.7.6 maven3.8.6 代码清单说明 依赖&#xff1a; <dependency><…

git 提交报错

报错提示 git -c diff.mnemonicprefixfalse -c core.quotepathfalse --no-optional-locks fetch --no-tags origin git -c diff.mnemonicprefixfalse -c core.quotepathfalse --no-optional-locks pull origin master From http://jira.suitbim.com:37990/scm/bigscreen/bigs…

通过茶叶酒水小程序商城的作用是什么?

茶叶酒水往往会在一起经营&#xff0c;同时又具备较强的送礼属性&#xff0c;需求度较高但经营商家同样不少&#xff0c;同行竞争激烈&#xff0c;加之同城生意有限、外地客户难以拓展、销售营销不足、品牌宣传效果差等痛点&#xff0c;传统酒水茶叶门店需要线上带来增长。 那…

VBA技术资料MF61:按每行指定字符数自动换行

【分享成果&#xff0c;随喜正能量】人生的旅途&#xff0c;一时的失意&#xff0c;一时的挫折&#xff0c;跌了一跤&#xff0c;不是人生的全部&#xff0c;只是人生的一个逗点&#xff0c;未来的成就、光辉&#xff0c;还有很多的虚线有待你继续去完成。。 我给VBA的定义&am…