一、适配器(Adapter)模式要解决的问题
在程序中,经常会存在现有的程序无法直接使用,需要做适当变换之后才能使用的情况,这种用于填补“现有程序”与“所需程序”之间的差异的设计模式就是Adapter模式。Adapter模式也称为Wrapper(包装器)模式。
二、Adapter模式的两种实现方式
1、类适配器模式(使用继承的适配器)
类图
被适配的对象
package com.dsanjun.gof.adapter.demo1;
/**
* 被适配的对象
*
* @author dyw
* @date 2019年10月5日
*/
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("(" + string + ")");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
实际需要使用的接口
package com.dsanjun.gof.adapter.demo1;
/**
* 实际需求接口
*
* @author dyw
* @date 2019年10月5日
*/
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
适配器
package com.dsanjun.gof.adapter.demo1;
/**
* 适配器
*
* @author dyw
* @date 2019年10月5日
*/
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
测试
package com.dsanjun.gof.adapter.demo1;
/**
* 测试
*
* @author dyw
* @date 2019年10月5日
*/
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("豢龙先生");
p.printWeak();
p.printStrong();
}
}
2、对象适配器模式(使用委托的适配器)
类图
被适配的对象
package com.dsanjun.gof.adapter.demo1;
/**
* 被适配的对象
*
* @author dyw
* @date 2019年10月5日
*/
public class Banner {
private String string;
public Banner(String string) {
this.string = string;
}
public void showWithParen() {
System.out.println("(" + string + ")");
}
public void showWithAster() {
System.out.println("*" + string + "*");
}
}
实际使用的类
package com.dsanjun.gof.adapter.demo2;
/**
* 实际使用的类
*
* @author dyw
* @date 2019年10月5日
*/
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
适配器
package com.dsanjun.gof.adapter.demo2;
/**
* 适配器
*
* @author dyw
* @date 2019年10月5日
*/
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner(String string) {
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
测试
package com.dsanjun.gof.adapter.demo2;
/**
* 测试
*
* @author dyw
* @date 2019年10月5日
*/
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("豢龙先生");
p.printWeak();
p.printStrong();
}
}
三、Adapter 模式中的一些重要角色
Adapter 模式类图
类适配器模式
对象适配器模式
Adapter 模式中各个类的作用
四、Adapter 模式中的思路拓展
1、很多时候,我们并不是从零开始编程,经常会用到现有的类。特别是当现有的类已经被充分测试过了,而且已经被用于其他软件中去,我们更愿意将这些类作为组件重复利用,使用适配器对现有的类进行适配,生成新的类。
2、如果你无法得到现有类的代码,但是你知道现有类的功能,那么你可以通过适配器模式生成新的类。
3、版本升级为了兼容早期版本,可以使用适配器。