Adapter 模式:
-
将两个不相关的类组合在一起使用,需要用到Adapter模式。一个是Adaptee,一个是Adapter。
-
实际上,两个不相关的类想要组合在一起使用, 可以修改类的接口, 但是,如果我们不想修改接口,或者根本没有源代码,就需要使用Adapter模式。
-
有一个接口用于提供需求,一个类用于实现需求,但是需要用一个类将两者联系起来进行转换,这个转换的类就是Adapter(适配器)
实例:
- Print 接口有两个方法,一个是输出*号修饰的字符串,一个输出<>包括的字符串。
- Banner 类是一个拥有两个可以实现Print接口功能的方法,而我们不想修改Print接口来配合Banner的工作,所以这个时候需要使用PrintBanner类来把两者联系起来。
Print 接口:
public interface Print {
public void printWithStar();
public void printWithPointBracket();
}
Banner 类:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Banner {
private String bannerName;
private final Logger LOGGER = LoggerFactory.getLogger(Banner.class);
public Banner(String bannerName) {
this.bannerName = bannerName;
}
public void showWithStar() {
LOGGER.info("{}","***"+ bannerName +"***");
}
public void showWithPointBracket() {
LOGGER.info("{}","<<<" + bannerName + ">>>");
}
}
PrintBanner 类:
public class PrintBanner extends Banner implements Print{
public PrintBanner(String bannerName) {
super(bannerName);
}
@Override
public void printWithStar() {
showWithStar();
}
@Override
public void printWithPointBracket() {
showWithPointBracket();
}
}
测试用例以及结果:
public void AdapterPatternTest() {
PrintBanner printBanner = new PrintBanner("Adapter");
printBanner.showWithStar();
printBanner.showWithPointBracket();
}
16:42:12.730 [main] INFO com.zyy.admin.pojo.Banner - ***Adapter***
16:42:12.732 [main] INFO com.zyy.admin.pojo.Banner - <<<Adapter>>>
什么时候使用Adapter模式:
- 当有一些类被测试过多册,Bug很少,这个时候我们开发一些新的接口时,可以选择复用这些类,这个时候就需要Adapter模式来把两者联系起来。
- 版本升级时,我们把旧的代码作为Adaptee,用Adapter作为新版本。
- 假如有一个接口需要实现一些方法,现在有一个类满足它的要求,而且已经测试完毕,Bug很少,这个时候我们有两者选择,一个是直接修改类的实现方法来满足接口的实现,另一个则是使用Adapter来承接两者。我们需要考虑到如果这个类与它关联的不只是这一个接口时,直接修改是不是会增大测试的成本,其他依赖这个类的模块会不会受影响,这样耦合度是不是太高了。所以,这个时候使用Adapter模式,我们既复用了已经测试好的类,更不会影响到与这个类关联的其他模块。
- 如果接口的实现和类的功能完全不同,那么我们也就完全没有必要使用Adapter模式。