Adapter模式
什么是Adapter模式?
Adapter即适配器的意思,它很像我们生活中用到的手机充电器,将220V电压转换成手机需要的5V或是9V电压;这其实就是适配器的作用,它位于实际情况(220V电压)与需求(5V或9V电压)之间,填补两者之间的差异;
Adapter模式的作用
位于实际情况(现有的类,方法等)与需求(希望实现的功能)之间,填补现有程序和所需程序之间的差异;(下文会举例说明什么是实际情况,什么是需求)
- 适配现有的类,生成新类;
- 使用经过充分测试的类作为组件,减少测试工作量,并可以快速定位bug;
- 版本升级时,可以将新版本扮演Apdatee角色,让旧版本扮演Target角色,编写一个扮演Adapter角色的类,实现新旧版本的兼容;
Adapter模式的分类
类适配器模式(使用继承的适配器);
对象适配器模式(使用委托的适配器);
类适配器模式举例
假设我们现在有一个Banner类,它包含两个方法,showWithParen()方法将输入的字符串加’( )’输出,showWithAster()方法将输入的字符串加’* *’输出;这个Banner相当于我们开头提到的200V电压这一“实际情况”;
假设我们现在有一个Print接口需要实现,该接口中声明了两个方法,分别是弱化字符串显示的printWeak()方法,即将字符串加’( )’输出,和强调字符串显示的printStrong()方法,即将字符串加’* *’显示;这相当于我们开头提到的手机需要的5V或9V电压这一“需求”;
那我们现在需要做的就是使用Banner类编写一个实现了Print接口的类,这个类就相当于一个适配器;它处于我们现有的类和想要实现的接口之间,填补两者之间的差异,发挥了适配的作用;
类适配器模式代码
Banner类:
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 + "*");
}
}
Print接口:
public interface Print {
public abstract void printWeak ();
public abstract void printStrong ();
}
PrintBanner类:
public class PrintBanner extend Banner implements Print {
public PrintBanner (String string) {
super (string);
}
public void printWeak () {
showWithParen ();
}
public void printStrong () {
showWithAster ();
}
}
Main类:
public class Main () {
public static void main (String args[]) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
UML用例图
委托模式示例代码
Print类:
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBanner类:
public class PrintBanner extends Print {
private Banner banner;
public PirntBanner(String string) {
this.banner = new Banner(string);
}
public void printWeak() {
banner.showWithParen();
}
public void printStrong() {
banner.showWithAster();
}
}
UML用例图
Adapter模式角色分析
Target
负责定义所需的方法,Print接口;它是我们实际所需要的东西或是所需要的接口;
Client
调用者,Main;
Adaptee
被适配者;它是我们现有的东西,比如一些测试通过的类、方法;
Adapter
适配者;它是一个组装者或是说改造者,将现有的类、方法等组合,改造,变成我们实际情况所需要的东西;
UML图
使用继承:
使用委托:
注:该博客内容为学习<<图解设计模式>>记录,文中所涉及的例子,UML图均摘录自<<图解设计模式>>;