说道JAVA中的适配器模式,不得不引用该设计模式的固定表述“适配器模式(Adapter ):将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作”。该模式其实类似于90年代那会的稳压器,当时的电压没有现在这样稳定,看电视的时候经常会出现闪屏的现象,为此爷爷专门通过工作关系渠道搞到全村第一台稳压器(见下图,哎老爷子拍照之前也不说弄弄干净,大伙凑合看下),从此开启了童年里幸福的观影时光。

现在21世纪了,除了老旧的稳压器外,各种各样的适配器已经是随处可见了(各种手机充电适配器,电脑电源适配器等等),这里为了方便大家理解,我们用做常用的电脑电源适配器来讲解今天的设计模式,首先要明确的是在这整个过程中我们只有三个具体的对象,分别是电源(插座)、适配器,电脑(电池)。下来我们开始撸代码:

 /*首先我们需要建立一个电源(插板)的接口,并提供对应方法
* (之所用接口是为了方便适配器实现)
*/
interface Power{
public void electric();
}
//首先我们需要建立一个电脑的接口,并提供对应方法
interface Computer{
public void battery();
}
//建立分别实现两个接口的类
class PowerImpl implements Power{
@Override
public void electric() {
System.out.println("我有电");
}
}
class ComputerImpl implements Computer{
@Override
public void battery() {
System.out.println("我有电池");
}
}
/*
* 建造适配器(这里我个人认为作为适配器,应该同时实现他所连接的两个接口
* ,在这里就是电源和电脑的接口)
*/
class Adapter implements Power,Computer{
/*适配器中声明名两个接口,并分别建立构造方法
* (适配器中应该有支持两种接口的模块)
*/
Power power;
Computer computer; public Adapter(Power power) {
super();
this.power = power;
}
public Adapter(Computer computer) {
super();
this.computer = computer;
}
/*适配器核心代码:
* 可以理解为要实现电脑电池充电的方法,就必须调用电源的电方法。
* 同理在这个过程中电源的电要实现自身价值,就必须调用电脑的电池。
*/
@Override
public void battery() {
power.electric();
}
@Override
public void electric() {
computer.battery();
}
}

测试类一:这里模拟在有电的情况下(即适配器一端已经连接电源插板),通过适配器调用电脑电池的过程

public class AdapterDemo {
public static void main(String[] args) {
Computer computer = new ComputerImpl();//实例化Computer(父类引用指向子类对象)
Adapter a = new Adapter(computer);//实例化适配器,可以理解为将另外一端连接到电脑的过程
method(a);
}
//静态方法(已经提供了电)
public static void method(Power p){
p.electric();
}
}

输出结果:

我有电池

测试类二:这里模拟在有电脑(电池)的情况下(即适配器一端已经连接电脑),通过适配器调用power的过程

 public class AdapterDemo1 {
public static void main(String[] args) {
Power power = new PowerImpl();//实例化Power(父类引用指向子类对象)
Adapter a = new Adapter(power);
method(a);
}
//静态方法(已经提供了电脑)
public static void method(Computer c){
c.battery();
}
}

输出结果:

我有电

这里写的比较规矩,方便初学者理解,大家也可以通过匿名内部类来简化(优化)这段代码,祝大伙撸的开心

JAVA适配器模式(从现实生活角度理解代码原理)的更多相关文章

  1. JAVA装饰者模式(从现实生活角度理解代码原理)

    装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...

  2. JAVA简单工厂模式(从现实生活角度理解代码原理)

    简单工厂模式(Simple Factory),说他简单是因为我们可以将此模式比作一个简单的民间作坊,他们只有固定的生产线生产固定的产品.也可以称他为静态工厂设计模式,类似于之前提到过静态代理设计模式, ...

  3. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  4. JAVA静态代理模式(从现实生活角度理解代码原理)

    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在 ...

  5. JAVA模板方法设计模式(从现实生活角度理解代码原理)

    概述: 定义一个功能的框架(骨架),一部分功能是确定的,一部分功能是不确定的,先把确定的部分实现,把不确定的部分延迟到子类中实现. 实现该模式的关键步骤: 第一步:抽象类,实现模板方法,定义功能(确定 ...

  6. 【C#硬件角度理解代码】函数

    函数的执行过程

  7. 从tcp原理角度理解Broken pipe和Connection reset by peer的区别

    从tcp原理角度理解Broken pipe和Connection reset by peer的区别 http://lovestblog.cn/blog/2014/05/20/tcp-broken-pi ...

  8. 从Java角度理解Angular之入门篇:npm, yarn, Angular CLI

    本系列从Java程序员的角度,带大家理解前端Angular框架. 本文重点介绍Angular的开发.编译工具:npm, yarn, Angular CLI,它们就像Java在中的Maven,同时顺便介 ...

  9. Java并发编程之深入理解线程池原理及实现

    Java线程池在实际的应用开发中十分广泛.虽然Java1.5之后在JUC包中提供了内置线程池可以拿来就用,但是这之前仍有许多老的应用和系统是需要程序员自己开发的.因此,基于线程池的需求背景.技术要求了 ...

随机推荐

  1. javascript运动系列第五篇——缓冲运动和弹性运动

    × 目录 [1]缓冲运动 [2]弹性运动 [3]距离分析[4]步长分析[5]弹性过界[6]弹性菜单[7]弹性拖拽 前面的话 缓冲运动指的是减速运动,减速到0的时候,元素正好停在目标点.而弹性运动同样是 ...

  2. Comet ASP.NET AJAX 示例

    最近公司有个项目,里面要求要用到Comet技术,所以就到网上找了一下相关的资料和文章,发现有些人说用Ajax的长轮询比较好,后来就百度了一下,发现comet貌似就是通过ajax演变而来的,也就是com ...

  3. JavaScript使用构造函数获取变量的类型名

    在JavaScript中,如何准确获取变量的类型名是一个经常使用的问题. 但是常常不能获取到变量的精确名称,或者必须使用jQuery 中的方法,这里 我通过 typeof ,jQuery.type 和 ...

  4. 关于CLR、CIL、CTS、CLS、CLI、BCL和FCL 的区分与总结

    关于CLR.CIL.CTS.CLS.CLI.BCL和FCL 的区分与总结 如果要想深入学习.NET平台,那么标题中的这些关键字对你来说并不陌生,这些名词构成了.NET庞大的生态系统,为了宏观认识.NE ...

  5. android 如何获取手机的图片、视频、音乐

    在android 开发中,很多时候,我们会需要调用到用户本机的照片.视频或者是音乐让用户选择,来进行我们APP对应的操作. button.setOnClickListener(new OnClickL ...

  6. Struts2学习笔记--使用Response下载文件和Struts2的StreamResult文件下载

    使用Response下载文件,servlet中的文件下载是通过流来实现的   我在webRoot文件夹下新建了一个文件夹from,里边放了一张图片,这里就以下载这张图片为例:download.jsp很 ...

  7. SDN/NFV若干问题

    1.首先谈一谈网络技术和组网技术的关系 网络可分为两层:业务网.承载网.业务网主要是组织业务系统,而承载网主要是用来传输信息流:包括传送网(点到点数据专线).数据网(端到端连接).内容分发网(点到多点 ...

  8. WCF局域网内使用代理无法访问解决方法

    问题描述 在大部分事业单位上网都是需要使用代理的,前几天带着一个同事写的程序过来部署,部署以后各个客户端通过WCF相互通讯,那么其中一个地方在本地局域网测试是没有问题的. 后发现一部分是原因是由于代理 ...

  9. 如何访问facebook (转)

    对于普通大众,访问facebook需要两个条件:1)使用代理 2)翻译网页内容.本文将介绍怎样安全高速地访问诸如facebook之类的国外网站,并提供相关软件下载. 工具/原料 chromeGAE软件 ...

  10. MySQL4.0命令操作学习笔记

    声明:下列内容并非原创,仅仅是最近学习笔记整理. -------------------------------------- 进入mysql安装路径bin目录下: 1.开启服务 winmysqlad ...