设计模式(七)适配器模式

适配器模式根据字面意思就可以理解其含义,将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。生活中最常见的手机电源适配器在不对手机做任何改变的情况下可以将220V电压转换成5V的手机充电电压。

常见的适配器模式有:对象适配器和缺省适配器模式(类适配器:受多继承限制略过。双向适配器:结构复杂,使用较少,掠过)。在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系

对象适配器模式:

Target:目标抽象类,定义客户所需要调用的接口
Adaptee:适配者类,定义已经存在的、需要呗适配的接口
Adapter: 适配器类,通过继承Target关联Adaptee来实现二者的关联

1
2
3
4
5
6
7
8
9
10
package info.aviraer.design_pattern.structure.adapter.object_adapter;

/**
* Created by avira on 2017/8/21.
*/
public interface Target {

public void invoke();

}

1
2
3
4
5
6
7
8
9
10
11
12
package info.aviraer.design_pattern.structure.adapter.object_adapter;

/**
* Created by avira on 2017/8/21.
*/
public class Adaptee {

public void restInvoke(){
System.out.print("Rest invoke.");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package info.aviraer.design_pattern.structure.adapter.object_adapter;

/**
* Created by avira on 2017/8/21.
*/
public class Adapter implements Target{

private Adaptee adaptee = new Adaptee();

@Override
public void invoke() {
adaptee.restInvoke();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
package info.aviraer.design_pattern.structure.adapter.object_adapter;

/**
* Created by avira on 2017/8/21.
*/
public class Client {

public static void main(String args[]){
Target target = new Adapter();
target.invoke();
}

}

缺省适配器模式:

当不需要实现接口的所有方法时,利用抽象类来对所有方法提供一个空的实现,子类就可以选择性的覆写需要实现的方法。

1
2
3
4
5
6
7
8
9
10
11
12
package info.aviraer.design_pattern.structure.adapter.default_adapter;

/**
* Created by avira on 2017/8/21.
*/
public interface ServiceInterface {

public void invoke1();

public void invoke2();

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package info.aviraer.design_pattern.structure.adapter.default_adapter;

/**
* Created by avira on 2017/8/21.
*/
public abstract class AbstractService implements ServiceInterface{

@Override
public void invoke1() {

}

@Override
public void invoke2() {

}

}
1
2
3
4
5
6
7
8
9
10
11
12
package info.aviraer.design_pattern.structure.adapter.default_adapter;

/**
* Created by avira on 2017/8/21.
*/
public class DefaultAdapter extends AbstractService{

@Override
public void invoke1() {
System.out.println("DefaultAdapter invoke.");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
package info.aviraer.design_pattern.structure.adapter.default_adapter;

/**
* Created by avira on 2017/8/21.
*/
public class Client {

public static void main(String args[]){
ServiceInterface serviceInterface = new DefaultAdapter();
serviceInterface.invoke1();
}

}

 

适配器模式主要优点:

1.目标类(Target)和适配者类(Adaptee)解耦,只需修改适配器(Adapter)实现接口正常调用。

2.适配器可复用可更换。

适配器模式适用场景:

1.现有接口不符合要求。

2.需要一个可复用的类来关联一些彼此没有太多关联的类