适配器模式分析
简介
适配器模式分为:
- 类适配器模式
- 对象适配器模式
- 缺省适配器模式
类适配器模式
类适配器模式是通过继承的方式把被适配的类的api转换成目标api
看下类图示例
看下代码示例
/*类适配器模式*/
public class AdapterClassModule {
interface User{
void method();
void method1();
void method2();
}
static class Adaptee {
public void method(){
System.out.println("method");
}
}
static class Adapter extends Adaptee implements User{
@Override
public void method1() {
System.out.println("method1");
}
@Override
public void method2() {
System.out.println("method2");
}
}
public static void main(String[] args){
User user = new Adapter();
user.method();
user.method1();
user.method2();
}
优点
- 由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
缺点
- 对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。
对象适配器模式
基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承adaptee类,而是持有adaptee类的实例,以解决兼容性的问题。
看下类图示例
代码示例
/*对象适配器模式*/
public class AdapterInstanceModule {
interface User{
void method();
void method1();
void method2();
}
static class Adaptee{
public void method(){
System.out.println("method");
}
}
static class Adapter implements User{
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void method() {
adaptee.method();
}
@Override
public void method1() {
System.out.println("method1");
}
@Override
public void method2() {
System.out.println("method2");
}
}
public static void main(String[] args){
User user = new Adapter(new Adaptee());
user.method();
user.method1();
user.method2();
}
优点
- 把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。
缺点
- 与类适配器模式相比,要想置换适配者类的方法就不容易。
缺省适配器模式
缺省适配器模式当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求
看下类图示例
代码示例
/*缺省,接口适配模式*/
public class AdapterInterfaceModule {
interface funcation{
void method();
void method1();
void method2();
void method3();
void method4();
}
static abstract class FunDefaut implements funcation{
@Override
public void method() {
}
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
@Override
public void method4() {
}
}
static class FunAdapter extends FunDefaut{
@Override
public void method() {
System.out.println("method");
}
@Override
public void method3() {
System.out.println("method3");
}
}
public static void main(String[] args){
FunAdapter funAdapter = new FunAdapter();
funAdapter.method();
funAdapter.method3();
}
}