java适配器模式

   Java适配器模式

(摘自百度文库)

问题引出:大家生活中可能碰到的一个问题就是你新买的手机自带的耳机是2.5接口的,不幸的是有一天你的耳机坏了,你去市面上根本就找不到2.5的耳机了,基本上是3.5接口了,没办法你只好买了个3.5接口的耳机,老板告诉你:“我给你一个适配器”这不问题就解决了。

问题分析:3.5的接口的耳机在你手机上本来是没法使用的,因为它没有按照2.5接口的设计啊,而现在我又想使用这幅耳机,于是乎有了“适配器(Adapter)”这个一个东西出来了。

Adapter模式的定义:把一个类的接口变换成客户端所期待的另外一种接口,使得原本由于接口不兼容而不能再一起工作的那些类可以一起工作。

适配器模式分类:1.类的适配器模式(采用继承实现)2.对象适配器(采用对象组合方式实现)

类的适配器类图:

 

 

 

 

模式的构成:以问题中例子为模型

目标抽象角色(Target):定义客户所期待要使用的接口,我们把手机当做客户端,客户端所需要使用的耳机的接口是2.5的,在这里就可以抽象出来一个2.5接口的设备(并不一定是耳机)。

源角色(Adaptee):需要被适配的接口,在这里指的是我们从市场上买回来的那个3.5接口的耳机。

适配器角色(Adapter)用来把源接口转换成符合要求的目标接口的设备,在这里指的是老板送给我们的那个“转换器”。

客户端(Client)这里指的就是那个给我们带来麻烦的手机喽。

示例代码:

Java代码  

  1. //Target   
  2.   
  3. package pattern.adapter;   
  4.   
  5. public interface Target {   
  6.   
  7.     public void provide2_5();   
  8.   
  9. }   
  10.   
  11. //Adaptee   
  12.   
  13. package pattern.adapter;   
  14.   
  15. public class Adaptee {   
  16.   
  17.     public void provide3_5(){   
  18.   
  19.        System.out.println("我是一个3.5的接口哦");   
  20.   
  21.     }   
  22.   
  23. }   
  24.   
  25. //Adapter   
  26.   
  27. package pattern.adapter;   
  28.   
  29. public class Adapter extends Adaptee implements Target {   
  30.   
  31.     @Override  
  32.   
  33.     public void provide2_5() {   
  34.   
  35.        this.provide3_5();   
  36.   
  37.     }   
  38.   
  39. }   
  40.   
  41. //Client   
  42.   
  43. package pattern.adapter;   
  44.   
  45. public class CellPhoneClient {   
  46.   
  47.     public static void main(String[] args) {   
  48.   
  49.        Target target = new Adapter();   
  50.   
  51.        //该手机只支持2.5接口的耳机   
  52.   
  53.        target.provide2_5();   
  54.   
  55.     }   
  56.   
  57. }  

//Target

 

package pattern.adapter;

 

public interface Target {

 

    public void provide2_5();

 

}

 

//Adaptee

 

package pattern.adapter;

 

public class Adaptee {

 

    public void provide3_5(){

 

       System.out.println("我是一个3.5的接口哦");

 

    }

 

}

 

//Adapter

 

package pattern.adapter;

 

public class Adapter extends Adaptee implements Target {

 

    @Override

 

    public void provide2_5() {

 

       this.provide3_5();

 

    }

 

}

 

//Client

 

package pattern.adapter;

 

public class CellPhoneClient {

 

    public static void main(String[] args) {

 

       Target target = new Adapter();

 

       //该手机只支持2.5接口的耳机

 

       target.provide2_5();

 

    }

 

}

 

 输出结果

:我是一个3.5的接口哦

从输出结果可以看出只支持2.5接口的手机成功的使用3.5的耳机了。这就是适配器模式的作用。

对象的适配器模式:

 

 

 

对象的适配器模式的不同之处在于Adapter角色封装了Adaptee角色,而不像类的适配器模式所采取的继承方式。其原理基本上是相似的。

应用适配器模式的场景:

1.系统需要使用现有的类,而现有类不符合当前系统的要求。如问题的提出。

2.系统要建立一个可以重复使用的类,用来与彼此没有太大关联的类或者在将来要引用的类一起工作。

java适配器模式之--对象适配器模式(转)

上次谈到类适配器,由于类的适配器只能用于单一源的适配,显然有多个源时显然满足需要,此时我们需要运用对象的适配器模式,对象的适配器模式是把一个源聚合到适配器类中去,从而能够满足多源的要求。看看代码

源代码:

 

public 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方法
}

目标接口

public interface Job {

public abstract void speakJapanese();
public abstract void speakEnglish();
public abstract void speakFrench();

}

对象适配器类

public 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() {
  
}

}

可以看出对象适配器类通过聚合引入了源对象,并实现了目标对象的方法speakFrench(或者照搬),将源对象做为适配器的成员变量,通过构造子来设定源对象。

思考:

1. 一个适配器可以将多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。

2. 与类的适配器模式相比,要想置换源类的的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个源类的子类,将源类的方法置换掉,然后再把源类的子类当做真正的源进行适配。

3. 虽然要想置换掉源类的方法不容易,但是要想增加一些新的方法则方便的很,而且新增的方法可以同时适用于所有的源。

转载于:https://www.cnblogs.com/lyunyu/archive/2013/04/11/3015484.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

封装(构造方法,构造器)

/* 构造方法:构造器 作用:建立对象的时候,对类中成员变量初始化, 1.构造方法的名字必须与类的名字相同 2.构造方法没有返回值 3.没有return 4.调用对象的时候直接调用构造方法,不需要再次调用 5.创建对象的时候&#x…

矩形嵌套

1 /*2 不是贪心&#xff0c;若是先按长排序在按宽&#xff0c;若是长很大宽很小 ,则若是后边款稍微大一些就不行了 3 */4 #include <stdio.h>5 #include <iostream>6 #include <cstring>7 #include <algorithm>8 using namespace std;9 10 const int …

继承(父类,子类的继承方式,成员变量、静态变量的引用方法)

/* 继承&#xff1a; 1.子类继承父类 2.java只支持单继承&#xff0c;不支持多继承&#xff0c;但是可以家族继承 3.父类在方法区创建完成后&#xff0c;子类创建时会带有父类标签&#xff08;方便找到父类&#xff09; 4.子类在堆中开辟空间时&#xff0c;父类的成员变量和私有…

【超详细教程】使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结...

去年就知道有这个功能&#xff0c;不过没去深究总结过&#xff0c;最近有写网络博客的欲望了&#xff0c;于是又重新拾起这玩意儿。 具体到底是用Windows Live Writer 2012还是用Word 2013&#xff0c;个人觉得看个人&#xff0c;因为这2个软件各有优点&#xff0c;各有缺点。 …

继承(继承父类,super)

/* 手机类&#xff1a;第一代功能&#xff1a; 1.打电话:键盘输入手机号码 2.接电话&#xff0c;显示来电号码&#xff0c;铃声提示第二代功能&#xff1a; 1.打电话&#xff1a;键盘输入手机号码 2.接电话&#xff0c;显示来电号码&#xff0c;显示归属地&#xff0c;彩铃提示…

modelsim 安装后运行,出现fatal License Error

参考一下连接地址&#xff1a; 1.http://blog.163.com/anson_an0908/blog/static/1873498452012719101835153/ 2.http://hi.baidu.com/mark_lewis/item/4ea2d6d172307094270ae767 3.http://www.cnblogs.com/oomusou/archive/2008/02/04/1064193.html 这个看完&#xff0c;应该就…

学生标准类

/* 请写出一个标准的学生类(Student)Student:成员变量&#xff1a;name,age,sex构造方法&#xff1a;无参构造方法&#xff0c;带三个参数的构造方法成员方法&#xff1a;A:get/set方法B:把所有成员变量的值输出的方法(show)*/ class Student3 {private String name;private in…

实现、设置-Android TabWidget-by小雨

查了好多资料&#xff0c;发现还是不全&#xff0c;干脆自己整理吧&#xff0c;至少保证在我的做法正确的&#xff0c;以免误导读者&#xff0c;也是给自己做个记录吧&#xff01; 首先先看一个小例子&#xff0c;接着讲授理原 TabTest.java view plaincopy to clipboardpr…

多态(继承父类的非静态重写方法)

/* 1.多态&#xff1a;程序中研究对象的多态 2.People p new Person&#xff08;&#xff09;;转换为父类 变量 new 子类&#xff08;&#xff09;&#xff1b; 3.意义&#xff1a;单继承下&#xff0c;可以无限扩展&#xff0c;满足扩展性 4.前提&#xff1a;必须有继承方法…

xml语法基础

1.xml直观样式 XML是最理想的树状数据结构的存储方式。 <?xml version"1.0" encoding"ISO-8859-1"?> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Dont forget…

继承(instanceof :比较运算符;不仅运行父类方法,也运行子类独有的方法)

/**/ class Animaldome{public void eat(){}public void sleep(){} }class Cat extends Animaldome{public void eat(){ System.out.println("我是猫咪&#xff0c;能吃饭"); }public void sleep(){ System.out.println("我是猫咪&#xff0c;我能睡觉");}…

spring map使用annotation泛型注入问题分析

今天在整一个spring的ioc学习demo&#xff0c;碰到一个问题&#xff0c;居然Autowire在set方法注入map时&#xff0c;map的key类型不能为String之外的其他类型&#xff0c;具体看下面问题 Autowiredpublic void setTypeMap(Map<Integer,String> typeMap) {this.typeMap …

抽象类-(抽象类的样子)

/* 抽象类&#xff1a; 1.继承时使用 2.抽象类不能被实例化 3.可以继承抽象类后再调用作用&#xff1a; 保证继承的完整性*/abstract class Animal4{public abstract void eat(); }class Cat4 extends Animal4{public void eat(){System.out.println("猫吃鱼");} } c…

宋体、文件-Ubuntu Linux中配置adb-by小雨

最近研究宋体、文件-&#xff0c;稍微总结一下&#xff0c;以后继续补充&#xff1a; 当前用户 sudo vi .bashrc 在这个文件中入加&#xff1a; export PATH”$PATH:export PATH"$PATH:/home/[username]/android-sdk-linux_86/platform-tools/" 启重后失效 全局设置 …

接口(多继承)

1.继承类时不支持多继承 2.接口可以多继承接口&#xff0c;但接口不能继承类 3.类之间单继承&#xff0c;接口之间多继承 4.继承和实现的区别&#xff1a; 继承是类关系&#xff0c;单继承。实现是类和接口之间的关系&#xff0c;多实现 单继承有局限性&#xff0c;多实现…

[数据结构]之栈

[数据结构]之栈 ##1 描述 栈&#xff1a;后进先出的数据结构。栈是封底的&#xff0c;只能从一个方向写入读出。栈的实现有两种&#xff0c;基于顺序表方式和基于链表方式。栈的场景&#xff1a;比如浏览器的返回场景。顺序表实现&#xff1a;1&#xff09;在顺序表的基础上创建…