java设计模式之适配器模式

时间:2021-10-08 21:59:04

适配器模式应用的场景是这样的:客户需要某种接口,而开发者本身已经开发过相关功能的接口或方法,只是接口名称,参数名称不符合客户需求。

适配器模式中又分为类的适配器、对象的适配器、接口的适配器三种。

一、类的适配器:本身有一个Source类,拥有一个方法,目标接口的TargetInterface。

Source类:

1 public class Source {
2
3 public void method1()
4 {
5 System.out.println("this is method1()...");
6 }
7 }

TargetInterface接口:

1 public interface TargetInterface {
2
3 void method1();
4
5 void method2();
6 }

类的适配器SourceAdapter:

 1 public class SourceAdapter extends Source implements TargetInterface{
2 @Override
3 public void method2() {
4 System.out.println("this is method2()...");
5 }
6
7 public static void main(String[] args) {
8 TargetInterface target = new SourceAdapter();
9 target.method1();
10 target.method2();
11 }
12 }

二、对象适配器:与类的适配器本质一样,只不过不是继承Source类而是使用Source的实例对象。

对象适配器SourceWrapper:

 1 public class SourceWrapper implements TargetInterface {
2
3 private Source source;
4
5 public SourceWrapper(Source source)
6 {
7 this.source = source;
8 }
9
10 @Override
11 public void method1() {
12 source.method1();
13 }
14
15 @Override
16 public void method2() {
17 System.out.println("this is method2()...");
18 }
19
20 public static void main(String[] args) {
21 Source source = new Source();
22 TargetInterface target = new SourceWrapper(source);
23 target.method1();
24 target.method2();
25 }
26 }

三、接口适配器:有时候一个接口定义了很多的方法,当实现该接口时必须实现所有的方法,但是我们只需要某一些方法,不需要的我并不关心。这种情况下就需要使用接口适配器了。

源接口SourceInterface:

1 public interface SourceInterface {
2
3 void method1();
4
5 void method2();
6 }

method1()可能此时我不关心,不想对其进行实现,此时可以定义一个抽象类AbstractSourceWrapper,实现该接口,将开发者关心的接口定义为抽象方法,这样开发者实现的时候只需要继承抽象类即可:

 1 public abstract class AbstractSourceWrapper implements SourceInterface {
2
3
4 @Override
5 public void method1() {
6 System.out.println("this is method1()...");
7 }
8
9 public abstract void method2();
10 }
 1 public class Wrapper extends AbstractSourceWrapper {
2 @Override
3 public void method2() {
4 System.out.println("this is method2()...");
5 }
6
7 public static void main(String[] args) {
8 Wrapper wrapper = new Wrapper();
9 wrapper.method1();
10 wrapper.method2();
11 }
12 }

由于我只关心method2,集成AbstractSourceWrapper时只实现method2就行了,至于method1,我不关心,让上一层去实现就行了。