目录
一、什么是适配器模式
二、UML图
1、类适配器的类图(使用继承)
2、对象适配器的类图(使用委托)
3、角色说明
三、示例程序
1、使用继承的适配器
2、使用委托的适配器
四、拓展思路与注意事项
1、什么时候使用adapter模式
2、如果没有现成的代码
3、版本升级与兼容性
4、功能完全不同的类
在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况。这种使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作的模式称为Adapter模式(适配器模式)
Target(对象):该角色负责定义所需的方法
Client(请求者):该角色负责使用target角色所定义的方法进行具体处理。
Adaptee(被适配):Adaptee是一个持有既定方法的角色
Adapter(适配):Adapter模式的主人公。使用adaptee角色的方法来满足Target角色的需求,这是Adapter模式的目的,也是Adapter角色的作用。
(1) 广告类 电源的比喻(交流100伏特)
package com.as.entity;
/**
* 广告类 电源的比喻(交流100伏特)
* @author Andy
* @date 2021/4/21 20:48
*/
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen(){
System.out.println("("+string+")");
}
public void showWithAster(){
System.out.println("*"+string+"*");
}
}
(2) 打印接口 电源比喻(电脑上使用的直流12V电源)
package com.as.module.adapter;
/**
* 打印接口 电源比喻(电脑上使用的直流12V电源)
*
* @author Andy
* @date 2021/4/21 20:54
*/
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
(3) 广告打印类 电源比喻(直流转换器)
package com.as.module.adapter;
import com.as.entity.Banner;
/**
* 广告打印类 电源比喻(直流转换器)
* @author Andy
* @date 2021/4/21 20:57
*/
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
(4) 适配器测试类
package com.as.module.adapter;
/**
* 适配器测试类
* @author Andy
* @date 2021/4/19 20:19
*/
public class test {
public static void main(String[] args) {
Print p = new PrintBanner("hello");
p.printWeak();
p.printStrong();
}
}
(1) 广告类 电源的比喻(交流100伏特)
package com.as.entity;
/**
* 广告类 电源的比喻(交流100伏特)
* @author Andy
* @date 2021/4/21 20:48
*/
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen(){
System.out.println("("+string+")");
}
public void showWithAster(){
System.out.println("*"+string+"*");
}
}
(2) 打印抽象类 电源比喻(电脑上使用的直流12V电源)
package com.as.module.adapter;
/**
* 打印抽象类 电源比喻(电脑上使用的直流12V电源)
*
* @author Andy
* @date 2021/4/21 20:54
*/
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
(3) 广告打印类 电源比喻(直流转换器)
package com.as.module.adapter;
import com.as.entity.Banner;
/**
* 广告打印类 电源比喻(直流转换器)
* @author Andy
* @date 2021/4/21 20:57
*/
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner(String string) {
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
(4) 测试类
package com.as.module.adapter;
/**
* 适配器测试类
* @author Andy
* @date 2021/4/19 20:19
*/
public class test {
public static void main(String[] args) {
Print p = new PrintBanner("hello");
p.printWeak();
p.printStrong();
}
}
在生产系统中,接口的重构不可避免,重构的过程中经常会用到现在的类,特别是当现在的类以及被充分测试过了,Bug很少,而且已经被用于其他软件之中时,我们更愿意将这些类作为组件重复利用
使用Adapter模式可以在完全不改变现有代码的前提下使现有代码适配于新的接口(API)。此外,在Adapter模式中,并非一定需要现成的代码。只要知道现有类的功能,就可以编写出新的类
使用Adapter模式可以使新旧版本兼容,帮助我们同时维护新版本和旧版本。让新版本扮演Adaptee角色,旧版本扮演Target角色。接着编写一个扮演Adapter角色的类,让它使用新版本的类来实现旧版本的类中的方法
当Adaptee角色和Target角色的功能完全不同时,Adapter模式是无法使用的。就如同我们无法用交流100伏特电压让自来水管出水一样