Adapter模式也被成为Wrapper模式。适配器模式用于填补“现有的程序”和“所需的程序”之间差异的设计模式。
Adapter模式有两种,即使用继承的适配器和使用委托的适配器。
1.使用继承的适配器
下面根据代码来解释使用继承的适配器这种模式。
1 package BigJunOba.bjtu.Adapter; 2 3 public class Banner { 4 5 private String string; 6 7 public Banner(String string) { 8 this.string = string; 9 } 10 11 public void showWithParen() { 12 System.out.println("(" + string + ")"); 13 } 14 15 public void showWithAster() { 16 System.out.println("*" + string + "*"); 17 } 18 }
这里的Banner类就是现有的程序。有可以对字符串进行操作的showWithParen和showWithAster方法。
1 package BigJunOba.bjtu.Adapter; 2 3 public interface Print { 4 5 public abstract void printWeak(); 6 public abstract void printStrong(); 7 }
Print接口声明了两种方法,即加括号printWeak和加星号printStrong方法。这里的Print接口就是实际的需求,现在要做的就是需要一个适配器。
1 package BigJunOba.bjtu.Adapter; 2 3 public class PrintBanner extends Banner implements Print { 4 5 public PrintBanner(String string) { 6 super(string); 7 } 8 9 @Override 10 public void printWeak() { 11 showWithParen(); 12 } 13 14 @Override 15 public void printStrong() { 16 showWithAster(); 17 } 18 }
PrintBanner类就是这个适配器。该类继承了Banner类并且实现了需求。
PrintBanner类使用showWithParen方法实现了printWeak,使用showWithAster方法实现了printStrong。
package BigJunOba.bjtu.Adapter; public class Main { public static void main(String[] args) { Print print = new PrintBanner("hhhhh"); print.printWeak(); print.printStrong(); } }
(hhhhh) *hhhhh*
通过测试结果我们可以看出使用继承的适配器的作用。
2.使用委托的适配器
下面根据代码来解释使用委托的适配器这种模式。
主要的Main类和Banner类不变。
1 package BigJunOba.bjtu.Adapter; 2 3 public abstract class Print { 4 5 public abstract void printWeak(); 6 public abstract void printStrong(); 7 }
将Print接口改成一个抽象类。
1 package BigJunOba.bjtu.Adapter; 2 3 public class PrintBanner extends Print { 4 5 private Banner banner; 6 7 public PrintBanner(String string) { 8 this.banner = new Banner(string); 9 } 10 11 @Override 12 public void printWeak() { 13 banner.showWithParen(); 14 } 15 16 @Override 17 public void printStrong() { 18 banner.showWithAster(); 19 } 20 21 }
然后PrintBanner类继承Print抽象类。
由于在PrintBanner类的banner字段中保存了Banner类的实例,该实例是在PrintBanner类的构造函数中生成的。然后printWeak和printStrong方法会通过banner字段调用banner类的showWithParen和showWithAster方法。这种在执行PrintBanner类的方法时,将处理交给其他实例即Banner实例处理的方式叫委托。
两种适配器模式的类图。