设计模式——适配器模式

什么是适配器模式

简单来说,适配器就是用来填补实际情况和需求两者之间地差异。比如说我们需要5V电压,但是国内只给的是220V电压,那我们现在就需要一个适配器帮我们将电压转换。

通过继承方式实现适配器模式

Adapter模式,比如我们有一个原本的类A,A中有一个a方法,这时候我们有一个B类需要A中的a方法,但是它不能直接调用(因为某个原因不匹配,但是B确实需要a方法),这时候我们可以通过一个C适配器类来包装A类的a方法,我们需要做的就是让C继承A类拥有A类的a方法,然后我们再让C实现B接口(B是一个接口),B类有一个方法时b方法(b方法可以理解为将来需要将a封装或者使用a方法的方法),这时候C适配器就重写了B接口的b方法,当我们B接口需要使用b方法的时候我们new一个C适配器类就行了(拿C实现B接口)。

示例代码:

我们有一个Banner类,Banner类中有showWithParen,showWithAster方法,这两个方法分别是在使用括号括住字符串和使用两个*包住字符串。然后我们有一个Print接口,这个接口有weakPrint和strongPrint方法,其实这两个方法需要使用showWithParen,showWithAster方法,所以我们可以添加一个适配器,让这个适配器作为Print的实现类,我们在适配器中继承Banner并调用Banner中的showWithParen,showWithAster方法,然后在封装这两个方法成为Print接口需要使用的方法就行了。

Banner类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Banner {
private String string;

public String getString() {
return string;
}

public void setString(String string) {
this.string = string;
}

public Banner(){}

public Banner(String string){
this.string = string;
}

public void showWithParen(){
System.out.println("(" + string + ")");
}

public void showWithAster(){
System.out.println("*" + string + "*");
}
}

Print接口

1
2
3
4
public interface Print {
void weakPrint();
void strongPrint();
}

PrintBanner适配器类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class PrintBanner extends Banner implements Print{
public PrintBanner(String string){
super(string);
}

@Override
public void weakPrint() {
showWithParen();
System.out.println("weak");
}

@Override
public void strongPrint() {
showWithAster();
System.out.println("strong");
}
}

客户端类

1
2
3
4
5
6
7
8
public class Main {

public static void main(String[] args) {
Print print = new PrintBanner("12345");
print.weakPrint();
print.strongPrint();
}
}

使用委托方式实现适配器模式

其实使用委托的方法就是改动一下适配器类,使适配器不是继承原来的类而是拥有原来的类,将是一个变为有一个在面向对象里会有很多好处。这貌似是Java编程思想里看到的,,,我也忘了。

这时候我们需要改动一下适配器类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  public class PrintBanner implements Print{

private Banner banner;
public PrintBanner(String string){
this.banner = new Banner(string);
}

@Override
public void weakPrint() {
banner.showWithParen();
System.out.println("weak");
}

@Override
public void strongPrint() {
banner.showWithAster();
System.out.println("strong");
}
}
-------------本文结束感谢阅读-------------