Java 设计模式 之 适配器模式(Adapter)
目录
适配器模式(Adapter)
类的适配器模式
对象的适配器模式
接口的适配器模式
适配器模式(Adapter)
1、Java 7 种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式,其中对象的适配器模式是各种模式的起源,如下图:
2、适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
3、适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
类的适配器模式
1、当希望将一个类(Source)转换成满足另一个新接口的类(Targetable)时,可以使用类的适配器模式,创建一个新类(Adapter),继承原有的类(Source),实现新的接口(Targetable)即可。
2、核心思想是:有一个Source类,拥有一个(些)方法,待适配,目标接口是 Targetable,通过 Adapter 类,将 Source 的功能扩展到 Targetable 里。
3、实现代码如下:
package com.lct.adapterModel;import java.util.logging.Logger;
//待适配的旧类
public class Source {//加法public void addition(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info(a + " + " + b + " = " + (a + b));}
}
package com.lct.adapterModel;
public interface Targetable {//加法,与旧类中的方法相同public void addition(float a, float b);//乘法,新类的方法public void multiplication(float a, float b);
}
package com.lct.adapterModel;import java.util.logging.Logger;
public class Adapter extends Source implements Targetable {@Overridepublic void multiplication(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info(a + " * " + b + " = " + (a * b));}
}
Adapter 类继承 Source类,实现 Targetable 接口。这样 Targetable 接口的实现类就具有了Source类的功能
4、测试如下:
package com.lct.test;import com.lct.adapterModel.Adapter;
import com.lct.adapterModel.Targetable;
public class Test {public static void main(String[] args) {Targetable targetable = new Adapter();targetable.addition(10.0F, 20F);targetable.multiplication(5.0F, 100F);}
}
对象的适配器模式
1、对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个 Wrapper 类,持有原类的一个实例,在 Wrapper 类的方法中,调用实例的方法就行。
2、基本思路和类的适配器模式相同,只是将 Adapter 类作修改,不继承 Source 类,而是持有 Source 类的实例,以达到解决兼容性的问题。
3、修改Adapter 类为 Wrapper 如下:
package com.lct.adapterModel;import java.util.logging.Logger;
public class Wrapper implements Targetable {private Source source;//旧对象作为参数传入public Wrapper(Source source) {this.source = source;}@Overridepublic void addition(float a, float b) {source.addition(a, b);//调用旧类中的方法}//新类的方法@Overridepublic void multiplication(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info(a + " * " + b + " = " + (a * b));}
}
4、测试类修改如下:
package com.lct.test;import com.lct.adapterModel.Source;
import com.lct.adapterModel.Targetable;
import com.lct.adapterModel.Wrapper;
public class Test {public static void main(String[] args) {Targetable targetable = new Wrapper(new Source());targetable.addition(10.0F, 20F);targetable.multiplication(5.0F, 100F);}
}
输出与第一种一样,只是适配的方法不同而已。
接口的适配器模式
1、接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类 Wrapper,实现所有方法,再写别的类的时候,继承抽象类重写需要的方法即可。
2、当写接口的实现类时,必须实现该接口的所有方法,而有时只需要其中的某一些方法,为了解决这个问题,引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,并实现了接口的所有方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。
3、下面使用代码实现上图:
package com.lct.adapterModel;//原始接口
public interface Sourceable {//加法public void addition(float a, float b);//乘法public void multiplication(float a, float b);//除法public void division(float a, float b);
}
package com.lct.adapterModel;import java.util.logging.Logger;//自定义抽象类实现接口中的所有方法
public abstract class AbstractWrapper implements Sourceable {@Overridepublic void addition(float a, float b) {}@Overridepublic void multiplication(float a, float b) {}@Overridepublic void division(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info(a + " / " + b + " = " + (a / b));}
}
package com.lct.adapterModel;import java.util.logging.Logger;//子类继承抽象类,重写自己需要的方法
public class SourceSub1 extends AbstractWrapper {@Overridepublic void addition(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info(a + " + " + b + " = " + (a + b));}
}
package com.lct.adapterModel;import java.util.logging.Logger;//子类继承抽象类,重写自己需要的方法
public class SourceSub2 extends AbstractWrapper {@Overridepublic void multiplication(float a, float b) {Logger logger = Logger.getAnonymousLogger();logger.info(a + " * " + b + " = " + (a * b));}
}
4、测试如下:
package com.lct.test;import com.lct.adapterModel.AbstractWrapper;
import com.lct.adapterModel.SourceSub1;
import com.lct.adapterModel.SourceSub2;public class Test {public static void main(String[] args) {AbstractWrapper abstractWrapper = new SourceSub1();abstractWrapper.addition(20F, 10F);abstractWrapper.division(100F, 20F);AbstractWrapper abstractWrapper1 = new SourceSub2();abstractWrapper1.multiplication(20F,30F);abstractWrapper1.division(200F,4F);}
}
Java 设计模式 之 适配器模式(Adapter)相关推荐
- java设计模式adapter,java设计模式-适配器模式(Adapter)
定义 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的用途 用电器做例子,笔记本电脑的插头一般都是三相的,即除了阳极 ...
- Java设计模式之适配器模式(属于结构型模式)
Java设计模式之适配器模式(结构型模式) 定义:将一个类的接口转换成客户希望的另外一个接口.Adaptor模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 模式中的角色: 目标接口(T ...
- 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabcd 介绍 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本 ...
- 【设计模式】—— 适配器模式Adapter
模式意图 如果已经有了一种类,而需要调用的接口却并不能通过这个类实现.因此,把这个现有的类,经过适配,转换成支持接口的类. 换句话说,就是把一种现有的接口编程另一种可用的接口. 模式结构 [类的适配器 ...
- 『设计模式』适配器模式(Adapter)
23种设计模式+额外常用设计模式汇总 (持续更新) 适配器模式(Adapter) 适配器模式把一一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. ...
- 【设计模式】适配器模式 Adapter Pattern
适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...
- Java 设计模式之适配器模式
一.了解适配器模式 1.1 什么是适配器模式 适配器模式将一个类的接口,转换成客户期望的另一个接口.适配器让原来接口不兼容的类可以合作无间.适配器模式有两种:"对象"适配器和&qu ...
- 设计模式之适配器模式(Adapter)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 二十三种设计模式[6] - 适配器模式(Adapter Pattern)
前言 适配器,属于类结构型模式.<设计模式 - 可复用的面向对象软件>一书中将之描述为" 将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可 ...
- java设计模式 之适配器模式
<JAVA与模式>一书中开头是这样描述适配器(Adapter)模式的: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 ...
最新文章
- tomcat安装apr优化
- 用FFmpeg搭建基于CNN的视频分析方案
- BZOJ1857:[SCOI2010]传送带——题解
- opencv python轻松入门_OpenCV轻松入门 面向Python
- php 零宽断言,正则表达式之零宽断言实例详解
- 计算机二级考试网易教程,学姐分享 | 计算机二级来袭,你准备好了吗?
- 全局替换安卓应用字体
- mysql 双主 脑裂_MySQL 高可用性keepalived+mysql双主
- 操作系统—内存的动态分区分配算法
- SpringBoot启动报jdbc连接池错误
- 数据库设计-简化字典表
- 人脸识别活体检测技术探讨:多物理特征融合加分类器的算法技术
- markdown删除代码空白行
- 韩信点兵python编程_韩信点兵——编制计算机程序解决问题
- 两边同时取对数求复合函数_【函数与导数】复合函数求导的几个妙用
- 基于STM32单片机的远程智能浇花花盆GSM短信浇水补光方案原理图程序设计
- 找出N个元素的数组中最大的K个数
- 支付项目:5、通用型支付系统(1)
- 寝室之早睡与晚睡矛盾
- scratch案例——星星猎手
热门文章
- 北大计算机学硕几年,我的OI经历 --张正超(深学教育资深教练、北大计算机系研究生)...
- 拓端tecdat:matlab用Logistic逻辑回归建模和马尔可夫链蒙特卡罗MCMC方法分析汽车实验数据
- 拓端tecdat|matlab递归神经网络RNN实现:桨距控制控制风力发电机组研究
- java 建立缓存_java动态缓存——创建一个简单的缓存
- 关于计算机的知识古人,世界仅是一串二进制编码?我们是虚拟的?古人早就给出了答案...
- C++学生信息管理系统1.0
- Python parser中的nargs
- python实现嵌套列表按指定位置元素排序、按子列表长度、子列表之和、绝对值和、最大/最小值排序
- python基于给定时间戳生成 未来/过去 前进/倒退 n个小时的时间戳
- python交互式shell之jupyter notebook初步安装使用