不学无数——适配器模式

简介: 适配器模式智者千虑必有一失,愚者千虑必有一得在我们开发过程中也会经常碰到一些给原有的系统加一些功能,所以不管前期我们呢可行性、需求分析和系统设计处理的多好,随着时间的推移,总会出一些“意外”。

适配器模式

智者千虑必有一失,愚者千虑必有一得

在我们开发过程中也会经常碰到一些给原有的系统加一些功能,所以不管前期我们呢可行性、需求分析和系统设计处理的多好,随着时间的推移,总会出一些“意外”。因此我们该如何处理掉这些“意外”呢?聪明的程序员们就想到了许多的补救模式,其中适配器模式就是补救模式中的一种。这种模式可以能够让你从因为业务的快速迭代而引发代码改变的烦恼中解脱出来。

适配模式的定义

将一个类的接口变换成客户端所期待的另一种接口,从而使原本因为接口不匹配而无法在一起工作的两个类能够一起工作

适配器模式有三个角色

  • Source:需要被适配的接口或者对象,你想把谁转换成目标角色,那么这个“谁”就是Source角色
  • Target:需要得到的接口或者对象,即适配完Source得到的接口或者对象,我们所期望的接口
  • Adapter:适配器,协调Source和Target使两个能够一起工作。通过继承或者是类关联的方式

继承适配器

适配器模式有两种体现形式,一种是通过继承来表现,一种是通过关联对象来表现,下面给演示下继承表现的适配器。

img_e6b87a18c0a4be5eb018f54b97b418f7.png
适配器模式类图

下面我们写一个简单的适配器模式的例子,如下所示

Target接口代码

interface Target{
    public void request();
}

实现了Target接口的类

class RealTarget implements Target{
    @Override
    public void request() {
        System.out.println("I am Target");
    }
}

Source源目标类

class Source{
    public void doSomething(){
        System.out.println("I am Source");
    }
}

接下来核心的角色要出现了就是Adapter

class Adapter extends Source implements Target{
    @Override
    public void request() {
        super.doSomething();
    }
}

接下来我们可以进行调用试试

public class AdapterTest {
    public static void main(String[] args) {
        Target target = new RealTarget();
        target.request();
        Target target2 = new Adapter();
        target2.request();
    }
}

打印如下

I am Target
I am Source

对象适配器

我们上面使用的是通过继承来使用适配器模式,还有一种做法就是将原有的继承关系变更为关联关系就可以了。

对象适配器和类适配器的区别在于:类适配器是通过继承来表现的,而对象适配器是对象的合成关系,也可以说是类的关联关系,这是两者的根本区别。两个都会在项目中用到,由于对象适配器是通过类间的关联关系进行耦合的,因此在设计的时候就比较灵活。而类适配器只能通过覆写源角色的方法进行扩展。因此在实际项目中,对象适配器的使用场景比较多。

我们还是先来看一下对象适配器的类图如下

img_314aa4d5e3abed3da6079d491b572587.png
对象适配器类图

然后写一个通用的例子

现在接口Target

interface Target2{
    public void printSource1();
    public void printSource2();
}

然后有Adapter

class Adapter implements Target{

    private Source1 source1;
    private Source2 source2;

    public Adapter(){
        source1 = new Source1();
        source2 = new Source2();
    }

    @Override
    public void printSource1() {
        source1.print();
    }

    @Override
    public void printSource2() {
        source2.print();
    }

}

然后两个Source

class Source1{
    public void print(){
        System.out.println("I am Source1");
    }
}

class Source2{
    public void print(){
        System.out.println("I am Source2");
    }
}

然后进行调用如下

public static void main(String[] args) {
    Target2 target2 = new Adapter2();
    target2.printSource1();
    target2.printSource2();
}

打印如下

I am Source1
I am Source2

这样在以后增加了需求以后,只需要重新写适配器即可,上层代码不用动。

适配器的优点

  • 适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色即可。
  • 增加了类的透明性:我们访问的是Target目标角色,但是具体的实现都是委托给了源角色,而这些对高层次的模块是透明的,也是它不需要关心的。
  • 提高了类的复用:源角色在原有的系统中还是能够继续使用,而在目标角色中也可以充当新的角色。
  • 灵活性好:如果某一天突然一个适配器不需要了,那么只要删除即可,基本上就类似于一个灵活的构件,想用就用。

适配器模式的使用场景

适配器应用的场景只需要记住一点就够了:当你有动机修改一个已经投产中的接口时,适配器模式是最适合你的模式。比如系统扩展了,需要使用一个已有或者是新建的类,但是这个类又不符合系统的接口,怎么办?这时候就可以使用适配器模式。

参考文章

相关文章
|
资源调度 流计算
Flink 指标参数源码解读(读取数量、发送数量、发送字节数、接收字节数等)(下)
Flink 指标参数源码解读(读取数量、发送数量、发送字节数、接收字节数等)(下)
265 1
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
第一个被DeepSeek干掉的岗位出现了!你慌吗?
DeepSeek作为AI领域的新兴力量,正以其强大的自然语言处理和数据分析能力改变工作方式。从人力资源到客服行业,基础性、重复性岗位逐渐被自动化取代,但同时也创造了新机会。文章探讨了岗位替代的现实与未来,强调劳动者应通过技能升级、人机协作和创新思维应对变革。同时,社会需完善职业培训和保障机制,帮助低技能劳动者适应AI时代,实现个人价值与社会发展的双赢。面对DeepSeek带来的变化,我们应积极拥抱而非恐慌,共同迎接未来挑战。
|
11月前
|
监控 安全 Cloud Native
云原生安全:Istio在微服务架构中的安全策略与实践
【10月更文挑战第26天】随着云计算的发展,云原生架构成为企业数字化转型的关键。微服务作为其核心组件,虽具备灵活性和可扩展性,但也带来安全挑战。Istio作为开源服务网格,通过双向TLS加密、细粒度访问控制和强大的审计监控功能,有效保障微服务间的通信安全,成为云原生安全的重要工具。
196 2
|
11月前
|
Linux 网络安全 数据安全/隐私保护
以无头模式运行 Raspberry pi
无头模式下的Raspberry Pi无需连接显示器、键盘和鼠标,通过网络远程访问进行操作,适合服务器或自动化项目。配置简单,只需在SD卡中添加特定文件即可启用SSH和Wi-Fi。
|
8月前
|
关系型数据库 网络安全 数据库
如何快速搭建一个属于自己的网站?
本文将详细介绍如何使用低代码开发平台,以可视化的方式添加多种风格的门户组件,快速高效地构建移动端和PC端门户网站。
|
前端开发 JavaScript
前端 CSS 经典:文字描边
前端 CSS 经典:文字描边
497 0
|
机器学习/深度学习 自然语言处理 搜索推荐
AIGC全链赋能广告营销行业
【1月更文挑战第15天】AIGC全链赋能广告营销行业
334 1
AIGC全链赋能广告营销行业
|
网络虚拟化 网络架构
【技术分享】Multilayer Switch
4月更文挑战第13天
441 0
|
Java 应用服务中间件 Android开发
开发踩坑记录之四:Tomcat内存溢出问题分析
系统平台运行一段时间后,平台出现无法访问的问题,重启对应的服务后平台恢复正常。查看日志发现在凌晨两点零四分之后没有对应的日志输出,直到重启服务后才有日志的正常输出。同时发现在Tomcat的目录下存在hprof文件,即java进程的内存镜像文件。初步猜测Tomcat发生了内存溢出导致服务出现假死现象,即在任务管理器中虽然为运行状态,但是实际已不能正常对外提供服务。   对于hprof文件的分析需要借助于内存分析工具Eclipse Memory Analyzer,通过它寻找到平台发生内存泄露的根源,再根据发生内存泄露的地方以及相关的日志信息定位什么样的业务场景下导致该异常情况的发生。
开发踩坑记录之四:Tomcat内存溢出问题分析
|
Java Apache 网络架构
【小家Spring】Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method ‘POST‘ not supported (附带其余好几个坑)(上)
【小家Spring】Feign发送Get请求时,采用POJO对象传递参数的最终解决方案 Request method ‘POST‘ not supported (附带其余好几个坑)