Adapter模式(适配器模式)也被称为Wrapper模式(包装模式);个人理解就是,新的接口,采用旧的方法实现。
适配器模式具有两种实现方式:
- 类适配器模式(使用继承旧方法的类,来实现新接口的调用);
- 对象适配器模式(使用委托的方法,将旧对象编程新接口实现类的一个属性,进行调用)。
实例程序1:
- Banner类,被适配的类,即旧方法实现类
package site.wangxin520.gof.adapter.damo1; /** * 使用适配器模式,将输入的字符A显示为(A)或者*A* * 本类即被适配的类 * @author wangXgnaw * */ public class Banner { private String string; //构造函数传参数 public Banner(String string){ this.string=string; } /* * 被适配的方法一,展示(string) */ public void showWithParen(){ System.out.println("("+string+")"); } /* * 被适配的方法二,展示*string* */ public void showWithAster(){ System.out.println("*"+string+"*"); } }
- Pring接口,目标接口
package site.wangxin520.gof.adapter.damo1; /** * 需求的接口,继承此接口的代码,对Banner进行适配 * @author wangXgnaw * */ public interface Print { public void printWeak(); public void printStrong(); }
- PringBanner类,实现了目标接口的适配器,用于适配旧方法
package site.wangxin520.gof.adapter.damo1; /** * 适配器,将printWeak接口方法,转换成Banner类中show***方法 * @author wangXgnaw * 方式一:采用继承原来Banner类的方法 */ public class PrintBanner extends Banner implements Print { /** * 构造函数,调用父类的构造函数 * @param string */ public PrintBanner(String string){ super(string); } /** * 在新接口的实现下,调用原来的方法 */ public void printWeak() { this.showWithAster(); } public void printStrong() { this.showWithParen(); } }
- 测试类
package site.wangxin520.gof.adapter.damo1; /** * 适配器模式的测试类 * @author wangXgnaw * */ public class AdapterTest { public static void main(String[] args) { Print p=new PrintBanner("小帅哥"); /* * 调用接口的方法 */ p.printStrong(); p.printWeak(); } }
- 运行结果
实例程序2:
- Banner类,被适配的类,即旧方法实现类 (没有变化)
package site.wangxin520.gof.adapter.damo2; /** * 使用适配器模式,将输入的字符A显示为(A)或者*A* * 本类即被适配的类 * @author wangXgnaw * */ public class Banner { private String string; //构造函数传参数 public Banner(String string){ this.string=string; } /* * 被适配的方法一,展示(string) */ public void showWithParen(){ System.out.println("("+string+")"); } /* * 被适配的方法二,展示*string* */ public void showWithAster(){ System.out.println("*"+string+"*"); } }
- Pring接口,目标接口 (没有变化)
package site.wangxin520.gof.adapter.damo2; /** * 需求的接口,继承此接口的代码,对Banner进行适配 * @author wangXgnaw * */ public interface Print { public void printWeak(); public void printStrong(); }
- PringBanner类,实现了目标接口的适配器,用于适配旧方法 ******(重点)
package site.wangxin520.gof.adapter.damo2; /** * 适配器,将printWeak接口方法,转换成Banner类中show***方法 * @author wangXgnaw * 方式二:使用对象属性的方法,而不像方式一那样继承 */ public class PrintBanner implements Print { private Banner banner; /** * 构造函数,调用父类的构造函数 * @param string */ public PrintBanner(String string){ banner=new Banner(string); } /** * 在新接口的实现下,调用原来的方法 */ public void printWeak() { banner.showWithAster(); } public void printStrong() { banner.showWithParen(); } }
- 测试类(没有变化)
package site.wangxin520.gof.adapter.damo2; /** * 适配器模式的测试类 * @author wangXgnaw * */ public class AdapterTest { public static void main(String[] args) { Print p=new PrintBanner("小帅哥"); /* * 调用接口的方法 */ p.printStrong(); p.printWeak(); } }
- 运行结果
总结:
Adapter模式会对现有的类进行适配,生成新的类。通过这种方式,可以很方便的创建出我们需要的方法群。使得代码变得简单可以适用于版本升级,接口的兼容性解决!
注意的是:目标接口和被适配的对象之间,如果功能完全不同的话,是无法使用此模式的!