java之类适配器

类适配器
所谓类适配器,指的是适配器Adapter继承我们的被适配者Adaptee,并实现目标接口Target。由于Java中是单继承,所以这个适配器仅仅只能服务于所继承的被适配者Adaptee。代码如下:
被适配者(Adaptee)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
package com.bluemsun.classadapter;public class Person { private int id; private String name; /** * person可以现在只能说英语 */ public void sayEnglish(){ System.out.println("Person can say english!"); } /** * 省略setter,getter. */} |
目标接口(Target)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
package com.bluemsun.classadapter;/** * 目标要求person可以说英语,法语,日语.但是现在的person仅仅可以说英语 * @author Administrator * */public interface Target_Person { void sayEnglish(); void sayFrench(); void sayJapanese();} |
适配器(Adapter)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package com.bluemsun.classadapter;/** * 类适配器,因为继承了Person,而Java中只能单继承,所以这个适配器只为person这一个类服务 * 这个适配器就让person类在不修改源码的基础上能实现目标接口所指定的方法 * @author Administrator * */public class Adapter_Person extends Person implements Target_Person{ @Override public void sayFrench() { System.out.println("Person can say French!"); } @Override public void sayJapanese() { System.out.println("Person can say Japanese!"); }} |
客户端(Client)
|
1
2
3
4
5
6
7
8
9
10
11
|
package com.bluemsun.classadapter;public class Test { public static void main(String[] args) { Target_Person person = new Adapter_Person(); person.sayEnglish(); person.sayFrench(); person.sayJapanese(); }} |
上面的几段简单代码演示了类适配器的作用。正如我们开始所言,这个适配器Adapter只能为Person这一个类所服务。这时候你可能会想,要是我所需要适配的类很多,是不是都需要为每一个需要适配的类写一个Adapter?有没有更加灵活的方式呢?答案是:有!就是对象适配器。
##############################################################

一句话描述:Adapter类,通过继承 src类,实现 dst 类接口,完成src->dst的适配。
别的文章都用生活中充电器的例子来讲解适配器,的确,这是个极佳的举例,本文也不能免俗:
充电器本身相当于Adapter,220V交流电相当于src,我们的目dst标是5V直流电。
我们现有的src类:
public class Voltage220 {
public int output220V() {
int src = 220;
System.out.println("我是" + src + "V");
return src;
}
}
我们想要的dst接口:
public interface Voltage5 {
int output5V();
}
适配器类:
public class VoltageAdapter extends Voltage220 implements Voltage5 {
@Override
public int output5V() {
int src = output220V();
System.out.println("适配器工作开始适配电压");
int dst = src / 44;
System.out.println("适配完成后输出电压:" + dst);
return dst;
}
}
Client类:
public class Mobile {
public void charging(Voltage5 voltage5) {
if (voltage5.output5V() == 5) {
System.out.println("电压刚刚好5V,开始充电");
} else if (voltage5.output5V() > 5) {
System.out.println("电压超过5V,都闪开 我要变成note7了");
}
}
}
测试代码:
System.out.println("===============类适配器==============");
Mobile mobile = new Mobile();
mobile.charging(new VoltageAdapter());
输出:
===============类适配器==============
我是220V
适配器工作开始适配电压
适配完成后输出电压:5
电压刚刚好5V,开始充电
###################################################
简单的抽象一个场景:手机充电需要将220V的交流电转化为手机锂电池需要的5V直流电,我们的demo就是写一个电源适配器,将 AC220v ——> DC5V,其实适配器模式可以简单的分为三类:类适配器模式、对象的适配器模式、接口的适配器模式。我们就以这三种模式来实现上述步骤。
类适配器模式
就上面提到的功能,简单的使用类适配器模式,Source类如下:
package com.demo.adapter.classadapter;
/**
* Created by italkbb on 2018/1/24.
*/
public class AC220 {
public int output220V(){
int output = 220;
return output;
}
}
我们的目标类Destination,只需要定义方法,由适配器来转化:
package com.demo.adapter.classadapter;
/**
* Created by italkbb on 2018/1/24.
*/
public interface DC5 {
int output5V();
}
Adapter类如下:
package com.demo.adapter.classadapter;
/**
* Created by italkbb on 2018/1/24.
*/
public class PowerAdapter extends AC220 implements DC5 {
@Override
public int output5V() {
int output = output220V();
return (output / 44);
}
}
对于使用,也很简单:
/**
* 类适配器使用demo
*/
private void initClassAdapter() {
DC5 dc5 = new com.demo.adapter.classadapter.PowerAdapter();
dc5.output5V();
}
因为java单继承的缘故,Destination类必须是接口,以便于Adapter去继承Source并实现Destination,完成适配的功能,但这样就导致了Adapter里暴露了Source类的方法,使用起来的成本就增加了。
java之类适配器的更多相关文章
- Java模式(适配器型号)
今天阅读Java该适配器模式,这里有一个小的总结和下谈感受.对于将来使用. 首先.让我们有关适配器先说说. 适应是“来源”至“目标”适应.其中连接这两个的关系是适配器.它负责“源”过度到“目标”. 举 ...
- java adapter(适配器)惯用方法
如果现在有一个Iterable类,你想要添加一种或多种在foreach语句中使用这个类的方法,例如方向迭代,应该怎么做呢? 如果之间继承这个类,并且覆盖iterator()方法,你只能替换现有的方法, ...
- java演示适配器(adapter)模式
为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...
- JAVA基础—适配器设计模式
适配器概念 在计算机编程中,适配器模式将一个类的接口适配成用户所期待的.使用适配器,可以使接口不兼容而无法在一起工作的类协调工作,做法是将类自己包裹在一个已经存在的类中. JDK对适配器设计模式的应用 ...
- Java 实现适配器(Adapter)模式
平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...
- 设计模式 适配器-Adapter
适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 直接上图.下面是对象适配器的类图.由于Java不支持多继承.所以这是Java的适配器实现方式. 结合H ...
- Android开发工程师文集-Fragment,适配器,轮播图,ScrollView,Gallery 图片浏览器,Android常用布局样式
Android开发工程师文集-Fragment,适配器,轮播图,ScrollView,Gallery 图片浏览器,Android常用布局样式 Fragment FragmentManager frag ...
- 软件设计模式之适配器模式(JAVA)
什么是适配器模式? 在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.适配器能将因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存 ...
- FragmentActivity_左右滑动的碎片
test1.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...
随机推荐
- 超全面的JavaWeb笔记day15<mysql数据库>
1.数据库的概述 2.SQL 3.DDL 4.DML 5.DCL 6.DQL MySQL 数据库 1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优 ...
- Java精选笔记_JSP开发模型
JSP开发模型 JSP Model JSP Model1简单轻便,适合小型Web项目的快速开发. JSP Model2模型是在JSP Model1的基础上提出的,它提供了更清晰的代码分层,更适用于多人 ...
- editplus修改配置文件保存位置
虚拟桌面默认保存位置为:
- ActiveMQ伪集群部署
本文借鉴http://www.cnblogs.com/guozhen/p/5984915.html,在此基础上进行了完善,使之成为一个完整版的伪分布式部署说明,在此记录一下! 一.本文目的 介绍如何在 ...
- C#中的抽象类与重写
今天的我们学习了好多,最初上午学习了文件流的方法,老师告诉我们是选修,可能以后不怎么用吧,但是还是想学下,似乎用个小程序读写文件很快地节奏,所以有点小兴趣学习,明天我再看看啦!今天之后学习了多态,继承 ...
- windows下配置VisualSVN Server服务器
下载安装文件: 服务端安装文件:VisualSVN-Server-1.6.2 客户端安装文件:TortoiseSVN-1.5.5.14361-win32-svn-1.5.4 上面是我使用的版本. 在V ...
- Spring学习笔记--初始化和销毁Bean
可以使用bean的init-method和destroy-method属性来初始化和销毁bean.定义一个Hero类: package com.moonlit.myspring; public cla ...
- poj_2553 强连通分支&出度为0的点
题目大意 N个点的有向图中,定义“好点”为: 从该点v出发可以到达的所有点u,均有一条路径使得u可达v. 求出图中所有的“好点”,并按照顺序从小到大输出出来. 题目分析 图存在多个强连通分支,强连通分 ...
- MyBatis官方文档——入门
入门 安装 要使用 MyBatis, 只需将 mybatis-x.x.x.jar 文件置于 classpath 中即可. 如果使用 Maven 来构建项目,则需将下面的 dependency 代码置于 ...
- 正则表达式—RegEx(RegularExpressio)(三)
今日随笔,继续写一点关于正则表达式的 知识.前两天介绍了正则表达式验证匹配,提取等一些基本的知识,今天继续分享下它的另一个强大的应用:替换(replace). 开始之前,还是要补一下昨天的内容. 在我 ...