java适配器模式

首先,先来先讲讲适配器。适配就是由“源”到“目标”的适配,而当中链接两者的关系就是适配器。它负责把“源”过度到“目标”。举个简单的例子,比如有一个“源”是一个对象人,他拥有2种技能分别是说日语和说英语,而某个岗位(目标)需要你同时回说日语、英语、和法语,好了,现在我们的任务就是要将人这个“源”适配的这个岗位中,如何适配呢?显而易见地我们需要为人添加一个说法语的方法,这样才能满足目标的需要。

接着讨论如何加说法语这个方法,也许你会说,为什么不直接在“源”中直接添加方法,我的理解是,适配是为了实现某种目的而为一个源类暂时性的加上某种方法,所以不能破坏原类的结构。同时不这么做也符合Java的高内聚,低耦合的原理。既然不能直接加,接着我们就来说该怎么来实现为人这个“源”添加一个方法,而又不破坏“源”的本身结构。

适配器模式有2种,第一种是“面向类的适配器模式”,第二种是“面向对象的适配器模式”。

先说“面向类的适配器模式”。顾名思义,这类适配器模式就是主要用于,单一的为某个类而实现适配的这样一种模式,为什么说只为某个类去实现,一会提到,我们先展示这种类适配模式的代码实现。

源的代码如下:

[c-sharp] view plain copypublic class Person {

private String name;

private String sex;

private int age;

public void speakJapanese(){

System.out.println(“I can speak Japanese!”);

}

public void speakEnglish(){

System.out.println(“I can speak English!”);

}

。。。//以下省略成员变量的get和set方法

}

目标接口的代码如下:

[c-sharp] view plain copypublic interface Job {

public abstract void speakJapanese();

public abstract void speakEnglish();

public abstract void speakFrench();

}

适配器的代码如下:

[c-sharp] view plain copypublic class Adapter extends Person implements Job{

public void speakFrench() {

}

}

好了,代码看完然后要做一些说明了,之前遗留的一个问题,为什么称其为类适配模式呢?很显然的,Adapter类继承了Person类,而在Java这种单继承的语言中也就意味着,他不可能再去继承其他的类了,这样也就是这个适配器只为Person这一个类服务。所以称其为类适配模式。

说完类的适配模式,我们要开始说第2种对象的适配器模式了。对象适配器模式是把“源”作为一个对象聚合到适配器类中。同样的话不多说,贴上代码:

源的代码以及目标代码同上,再次不再赘述。

仅贴出适配器代码:

[c-sharp] view plain copypublic class Adapter implements Job {

Person person;

public Adapter(Person person) {

this.person = person;

}

public void speakEnglish() {

person.speakEnglish();

}

public void speakJapanese() {

person.speakJapanese();

}

//new add

public void speakFrench() {

}

}

对象的适配器模式,把“源”作为一个构造参数传入适配器,然后执行接口所要求的方法。这种适配模式可以为多个源进行适配。弥补了类适配模式的不足。

现在来对2种适配模式做个分析:

1.类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。

2.适配器模式主要用于几种情况:(1)系统需要使用现有的类,但现有的类不完全符合需要。(2)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。

最后,再来顺带谈谈默认适配器模式:这种模式的核心归结如下:当你想实现一个接口但又不想实现所有接口方法,只想去实现一部分方法时,就用中默认的适配器模式,他的方法是在接口和具体实现类中添加一个抽象类,而用抽象类去空实现目标接口的所有方法。而具体的实现类只需要覆盖其需要完成的方法即可。代码如下:

接口类:

[c-sharp] view plain copypublic interface Job {

public abstract void speakJapanese();

public abstract void speakEnglish();

public abstract void speakFrench();

public abstract void speakChinese();

}

抽象类:

[c-sharp] view plain copypublic abstract class JobDefault implements Job{

public void speakChinese() {

}

public void speakEnglish() {

}

public void speakFrench() {

}

public void speakJapanese() {

}

}

实现类:

[c-sharp] view plain copypublic class JobImpl extends JobDefault{

public void speakChinese(){

System.out.println(“I can speak Chinese!”);

}

}

java适配器模式实例

将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

适配器一共包括3种角色

1、目标:目标是一个接口,该接口是客户想使用的接口

2、被适配者:被适配者是一个已存在的接口或抽象类,这个接口或抽象类需要适配

3、适配器:适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配者的指着是对被适配者接口与目标进行适配

[java] view plain copypackage org.zhy.adapter;

/**

* 目标

* @author zhengyi

*

*/

public interface ThreeElectricOutlet {

//用来刻画三相插座

public abstract void connectElectricCurrent();

}

[java] view plain copypackage org.zhy.adapter;

/**

* 适配器

* @author zhengyi

*

*/

public class TreeElecricAdapter implements ThreeElectricOutlet {

TwoElectricOutlet outlet;

public TreeElecricAdapter(TwoElectricOutlet teo) {

this.outlet=teo;

}

@Override

public void connectElectricCurrent() {

outlet.connectElectricCurrent();

}

}

[java] view plain copypackage org.zhy.adapter;

/**

* 被适配者

* @author zhengyi

*

*/

public interface TwoElectricOutlet {

//刻画两相插座

public abstract void connectElectricCurrent();

}

[java] view plain copypackage org.zhy.adapter;

public class ApplicTIon {

public staTIc void main(String[] args) {

ThreeElectricOutlet outlet; //目标接口三相插座

Wash wash=new Wash();

outlet=wash;

System.out.println(“使用三相插座接通电流”);

outlet.connectElectricCurrent();

Tv tv=new Tv();

TreeElecricAdapter adapter=new TreeElecricAdapter(tv);

outlet= adapter;

System.out.println(“使用三相插座接通电流”);

outlet.connectElectricCurrent();

}

}

[java] view plain copypackage org.zhy.adapter;

/**

* 洗衣机

* @author zhengyi

*

*/

public class Wash implements ThreeElectricOutlet {

private String name;

public Wash() {

name=“洗衣机”;

}

public Wash(String name){

this.name=name;

}

@Override

public void connectElectricCurrent() {

turnOn();

}

private void turnOn(){

System.out.println(name+“开始洗衣服”);

}

}

[java] view plain copypackage org.zhy.adapter;

/**

* 电视

* @author zhengyi

*

*/

public class Tv implements TwoElectricOutlet {

private String name;

public Tv() {

name=“长江电视机”;

}

public Tv(String s){

this.name=s;

}

@Override

public void connectElectricCurrent() {

turnOn();

}

private void turnOn(){

System.out.println(name+“开始播放节目”);

}

}

适配器的适配程度

1、完全适配

如果目标接口中的方法数目与被适配者接口的方法数目相等那么适配器可将被适配者接口与目标接口进行完全适配

2、不完全适配

如果目标接口中的方法数目少于被适配者接口的方法数目那么适配器只能将被适配者接口与目标接口进行适配

3、剩余适配

如果目标接口中的方法数目大于被适配者接口的方法数目。那么适配器可将被适配者接口与目标接口进行完全适配,但必须将目标多余的方法给出用户允许默认实现

适配器模式的优点

1、目标和适配者是完全解耦的关系

2、适配器模式满足“开-闭原则”当添加一个实现Adaptee接口的新类时,不必修改Adaptee,而Adaptee就能对这个新类的实例进行适配

java写适配器模式实例_java适配器模式实例相关推荐

  1. java适配器模式例子_java适配器模式实例解析

    适配器模式作为一种结构型设计模式,在软件系统设计开发中使用到的频率非常之高,深受开发人员的青睐.本文会讲解适配器模式的知识要点,以及在实际项目中所使用的真实案例. 1.适配器模式概述: 适配器模式(A ...

  2. java适配器模式例子_Java适配器模式

    一.介绍: 适配器模式是一种结构型设计模式.适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 这种模式涉及一个单独的类, ...

  3. java中的递归算法_java递归算法实例分析

    递归算法设计的基本思想是: 对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解. 在做递归算法的时候,一 ...

  4. java编程50实例_java编程实例大全及详解谜底(50例).doc

    java编程实例大全及详解谜底(50例).doc 还剩 33页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: 谓 ...

  5. java编程的例子_java编程实例

    1:编写程序,判断给定的某个年份是否是闰年. 闰年的判断规则如下:(1)若某个年份能被4整除但不能被100整除,则是闰年.(2)若某个年份能被400整除,则也是闰年. import java.util ...

  6. java继承的举例_java继承实例

    实例需求:实现一个名为Person的类和它的子类Employee,Manager是Employee的子类,设计一 个类Add()用于涨工资,普通员工一次能涨10%,经理能涨20%. 具体要求如下: ( ...

  7. java中何时不能实例_Java对象实例是何时被创建

    您可能感兴趣的话题: Java 核心提示:对象实例何时被创建,这个问题也许你用一句话就能回答完了.但是它的潜在陷阱却常常被人忽视,这个问题也许并不像你想的那么简单,不信请你耐心看下去. 对象实例何时被 ...

  8. java怎么做映射_Java 映射实例

    关于一个java映射的demo 1.主要有四个文件 (1)Test.java package demo1; import java.lang.reflect.Field; import java.ut ...

  9. java 正则 实例_Java正则表达式实例详解

    创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xh ...

最新文章

  1. zoj 1204 Additive equations
  2. java 无符号转有符号_java有符号无符号的转换
  3. 学python的好处-python有什么优势
  4. 转 DevExpress-ASPxPageControl 动态添加 TabPage 内容
  5. Markdown的基本语法
  6. python 做网页_女生30岁以前,怎么早做打算
  7. 07- app的弱网测试
  8. 中兴5250交换机配置手册_TSN工业交换机中文说明
  9. PS教程第二十课:有了选区就有了界限
  10. Flask 应用上下文
  11. 水经注万能地图下载器、影像插件和转换器的功能与关系
  12. 蓝牙耳机哪个牌子好?国庆出游蓝牙耳机推荐
  13. 使用Kinect2作为Oculus游戏应用的输入设备
  14. 谷歌浏览器怎么设置成暗黑模式
  15. 用Python计算北京地铁的两站间最短换乘路线
  16. Windows下遇到OSError: [WinError 6] 句柄无效的问题
  17. 关于阿里云ECS服务器连接RDS数据库
  18. 基于ESP8266的智能家庭检测系统
  19. 别再付费了!霸屏朋友圈的“蚂蚁呀嘿”视频教程大公开
  20. 【DSP开发】【VS开发】MUX和DEMUX的含义

热门文章

  1. 第三届无线通信AI大赛分享交流会暨颁奖典礼顺利举办,大赛圆满收官
  2. Java实现面向切面编程(AOP)
  3. 网盘可以良心到什么程度? 试试MEGA吧!
  4. c语言如何读取avi文件,avilib库的使用
  5. 1034 有理数四则运算 (20分)
  6. Mozilla XUL分析
  7. 编译 android monkey,Android monkey使用详解
  8. CentOS安装BBR加速
  9. java esb 总线,PHP和ESB(使用Mule)(ESB:企业服务总线)
  10. 同轴高清技术---AHD/HD-CVI/HD-SDI/HD-TVI