什么是适配器模式
在开发中,经常会出现现有的程序无法直接使用,需要做适当的转变之后才能使用。这种填补“现有的程序”和“所需的程序”之间的差异的设计模式就叫做适配器模式。
适配器模式有以下两种:
- 类适配器模式(使用继承的适配器)
- 对象适配器模式(使用委托的适配器)
类适配器模式
Banner为类,Print为接口,PrintAdapter为适配器继承Banner并实现Print
Banner
package StructuralPattern.AdapterMode.ClassAdapter;
/**
* 横幅类
*/
public class Banner {
private String content;
public Banner(String content) {
this.content = content;
}
/**
* 带括号
*/
public void showWithParen() {
System.out.println("(" + content + ")");
}
/**
* 带星号
*/
public void showWithAster() {
System.out.println("*" + content + "*");
}
}
package StructuralPattern.AdapterMode.ClassAdapter;
/**
* 打印接口
*/
public interface Print {
void printWeak();
void printStrong();
}
PrintBanner
package StructuralPattern.AdapterMode.ClassAdapter;
/**
* 适配器
*/
public class PrintBanner extends Banner implements Print{
public PrintBanner(String content){
super(content);
}
/**
* 带括号
*/
@Override
public void printWeak() {
super.showWithParen();
}
/**
* 带星号
*/
@Override
public void printStrong() {
super.showWithAster();
}
}
Main
package StructuralPattern.AdapterMode;
import StructuralPattern.AdapterMode.ClassAdapter.Print;
import StructuralPattern.AdapterMode.ClassAdapter.PrintBanner;
/**
* main
*/
public class Main {
public static void main(String[] args) {
Print adapter = new PrintBanner("hello");
adapter.printWeak();
adapter.printStrong();
}
}
结果
如果Print也为类,那么就无法使用适配器了,Java是单继承的,这时就要使用对象适配器模式
对象适配器模式
Banner为类,Print为类,PrintAdapter为适配器继承Print,PrintAdapter中通过Banner类的对象去打印横幅
Banner
package StructuralPattern.AdapterMode.ObjectAdapter;
/**
* 横幅类
*/
public class Banner {
private String content;
public Banner(String content) {
this.content = content;
}
/**
* 带括号
*/
public void showWithParen() {
System.out.println("(" + content + ")");
}
/**
* 带星号
*/
public void showWithAster() {
System.out.println("*" + content + "*");
}
}
package StructuralPattern.AdapterMode.ObjectAdapter;
/**
* 打印类
*/
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBanner
package StructuralPattern.AdapterMode.ObjectAdapter;
/**
* 适配器
*/
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner(Banner banner){
this.banner = banner;
}
/**
* 带括号
*/
@Override
public void printWeak() {
banner.showWithParen();
}
/**
* 带星号
*/
@Override
public void printStrong() {
banner.showWithAster();
}
}
Main
package StructuralPattern.AdapterMode;
import StructuralPattern.AdapterMode.ObjectAdapter.Print;
import StructuralPattern.AdapterMode.ObjectAdapter.Banner;
import StructuralPattern.AdapterMode.ObjectAdapter.PrintBanner;
/**
* main
*/
public class Main {
public static void main(String[] args) {
Print adapter = new PrintBanner(new Banner("hello"));
adapter.printWeak();
adapter.printStrong();
}
}
结果
这里是使用Banner对象去做一个打印,解决了单继承问题
总结
通过例子可以看到,Main方法调用适配器的方法都未改变,只是适配器的实现方式不同,创建对象方式会有一定差异,这最大程度避免了在调用处去做改变。
实际开发中也有许多地方用到了适配器模式,JDBC就是一个很好的例子,Java可以很方便的通过JDBC去操作不同的数据库。