Java设计模式学习05——适配器模式

来源:互联网 发布:变老软件 编辑:程序博客网 时间:2024/06/16 16:51

转:http://blog.csdn.net/xu__cg/article/details/52948633


之前讲的几种模式都是创建型模式,现在开始讲结构型模式。何为结构型模式?结构型模式的 核心作用, 是从程序结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。

一、适配器模式定义


适配器模式,把一个类接口变化成客户端所期待的另一个类的接口,使原来因接口不匹配而无法一起工作的类能够一起工作。

二、适配器模式举例


1.生活中例子: 用电器做例子,一个电器的插头只有两相,而有些地方的电源插座却只有三相。电源插座与电器的电源插头不匹配使得电器无法使用。这时候一个三相到两相的转换器(适配器)就能解决此问题,而这正像是本模式所做的事情。 
这里写图片描述

2.Java源码中的例子:如Java IO中的java.io.InputStreamReader(InputStream) 和java.io.OutputStreamWriter(OutputStream)就是典型的适配器模式,通过InputStreamReader、OutputStreamWriter适配器将字节流转换为字符流。

三、适配器模式结构

  • Target(目标角色): 客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
  • Adaptee(源角色):现在需要适配的类。
  • Adapter(适配器): 适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。

示例代码 
Target (目标角色) :

/** * 目标角色,如举例中需要转换成的三相插头 *  @author  14501_000 */public interface Target {     void handleReq();}   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Adaptee(源角色):

/** * 源角色,需要被适配的类,如举例中的两脚插头 */public class Adaptee {     public void request(){        System.out.println( "可以完成客户请求的需要的功能!" );    }}   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Adapter(适配器):

/** * 适配器,把源接口转换成目标接口,即将两脚插头转换为三脚插头 * */public class Adapter extends Adaptee implements Target{     public void handleReq() {         super.request();    }     }   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

客户端:

/** * 客户端类,通过三脚插座进行工作 * */public class Client {     public void work(Target t){         t.handleReq();    }     public static void main(String[] args){        Client c = new Client();        Target t = new Adapter();         c.work(t);    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

四、类适配器与对象适配器


  上面这种实现的适配器称为类适配器,因为 Adapter 类既继承了 Adaptee (被适配类),也实现了 Target 接口(因为 Java 不支持多继承,所以这样来实现),在 Client 类中我们可以根据需要选择并创建任一种符合需求的子类,来实现具体功能。另外一种适配器模式是对象适配器,它不是使用多继承或继承再实现的方式,而是使用直接关联,或者称为委托的方式,通过组合的方式跟适配对象组合。

对于Adapter类和Client类的修改

/** * 适配器,把源接口转换成目标接口,即将两脚插头转换为三脚插头 * */public class Adapter implements Target{    Adaptee adaptee ;     public Adapter(Adaptee adaptee){         this.adaptee = adaptee ;    }     public void handleReq() {         adaptee.request();    }}public class Client {     public void work(Target  t){         t.handleReq();    }     public static void main(String[]  args ) {        Client c =new Client();        Adaptee adaptee =new Adaptee();        Target t = new Adapter(adaptee);         c.work( t );    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

测试结果与上面的一致。 使用对象适配器模式,可以使得 Adapter 类(适配类)根据传入的 Adaptee 对象达到适配多个不同被适配类的功能,当然,此时我们可以为多个被适配类提取出一个接口或抽象类。这样看起来的话,似乎对象适配器模式更加灵活一点。

适配器模式适用场景


  • 系统需要使用现有的类,而这些类的接口不符合系统的接口。
  • 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  • 两个类所做的事情相同或相似,但是具有不同接口的时候。
  • 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不会教宝宝英语怎么办 宝宝手弄破了皮怎么办 幼儿喜欢吃手指怎么办 好动的宝贝应该怎么办 幼儿不遵守规则怎么办 幼儿表达不完整怎么办 小孩好动坐不定怎么办 宝宝喜欢用左手怎么办 最近老是做噩梦怎么办 总是做噩梦是怎么办 幼儿总是动手打人怎么办 幼儿爱打人老师怎么办 一岁多宝宝太皮怎么办 小孩会有多动症怎么办 我小孩有多动症怎么办 家有多动症孩子怎么办 4岁宝宝多动症怎么办 四岁宝宝多动症怎么办 一岁宝宝多动症怎么办 5岁宝宝多动症怎么办 7岁宝宝多动症怎么办 小宝宝太调皮了怎么办 3岁宝宝好动怎么办 四岁宝宝好动怎么办 好动的孩子应该怎么办 孩子上课总发呆怎么办 小孩上课发呆走神怎么办 宝宝幼儿园坐不住怎么办 孩孑上课听不懂怎么办 25岁儿子不听话怎么办 幼儿午睡爱说话怎么办 幼儿园实习很累怎么办 怀孕后脚气严重怎么办 拼音a不会写怎么办 儿童7岁还坐不住怎么办 孩子缺锌手蜕皮裂开怎么办 宝宝读幼儿园哭怎么办 幼儿上课爱讲话怎么办 孩子上课总是乱跑怎么办 孩子听不懂老师讲课怎么办 高一上课听不懂怎么办