说道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. OpenCASCADE Hidden Line Removal

    OpenCASCADE Hidden Line Removal eryar@163.com Abstract. To provide the precision required in industr ...

  2. jsp通过易宝方式实现在线支付

    项目下载地址: https://github.com/hjzgg/OnlinePayment 参考:http://blog.csdn.net/jadyer/article/details/738025 ...

  3. 【原创】开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  4. 模板引擎Nvelocity实例

    前言 最近一直忙于工作,没时间来管理博客,同时电脑也不给力,坏了一阵又一阵,最后还是去给修理了,这不刚一回来迫不及待的就写一篇文章来满足两个月未写博客的紧迫感. Nvelocity 关于nveloci ...

  5. 【前端攻略】最全面的水平垂直居中方案与flexbox布局

    最近又遇到许多垂直居中的问题,这是Css布局当中十分常见的一个问题,诸如定长定宽或不定长宽的各类容器的垂直居中,其实都有很多种解决方案.而且在Css3的flexbox出现之后,解决各类居中问题变得更加 ...

  6. UWP开发之Mvvmlight实践三:简单MVVM实例开发(图文详解付代码)

    在做MVVM各种框架对比之前,我觉得有必要先自己做一个简单的MVVM实现案例比较好,这样就可以看到自己实现的时候有那些不方便的地方.而各种框架又是怎么解决我们这些麻烦的. 案例介绍:用户登录画面,没有 ...

  7. 玩转Jquery,告别前端知道思路忘记知识点的痛苦

    本节内容: 本章主要讲解一下jquery,主要是工作中用的前端框架是datetables框架,然后datetables框架又是基于jqeury研发的,所以要想学一个东西,就必须要了解其底层,不然走路都 ...

  8. iOS 使用EZAudio库生成wav出错的情况

    使用EZAudio库 录M4A格式可以参考该库例子中的代码. 录wav格式得改下源码.看下面的代码 AVAudioSession *session = [AVAudioSession sharedIn ...

  9. 附录B 安装MySql数据库

    B.1  卸载旧的MaySql程序 第一步   查找以前是否安装有mysql 使用命令查看是否已经安装过mysql: #rpm -qa | grep -i mysql 如果没有结果,则可以进行mysq ...

  10. 实验记录:Oracle redo logfile的resize过程

    实验记录:Oracle redo logfile的resize过程. 实验环境:RHEL 6.4 + Oracle 11.2.0.3 单实例 文件系统 实验目的:本实验是修改redo logfile的 ...