2007-01-16

设计模式之适配器 Adapter

关键字: Adapter 换个包装,再度利用。
Adapter  换个包装,再度利用。

此实例把“Hello”字符串输出成

(Hello)

 *Hello*

适配器起到把交流电转换成直流电的作用,在这里的适配器是PrintBanner类,它分别利用showWithParen方法,showWithAster方法来实现printWeak和printStrong。

                                            表2.1 使用电源与程序实力的对应关系
  电源 程序示例
既有的内容 交流电220v Banner类 (showWithParen,showWithAster)
转换装置 适配器 PrintBanner类
需要的结果 直流电12v Print接口(printWeak,PrintStrong)

 

 

 

 

Banner 类
  1. public  class Banner {   
  2.   private String string;   
  3.   public Banner (String string) {   
  4.     this.string = string ;   
  5.   }   
  6.   public void showWithParen() {   
  7.     System.out.println("("+string+")");   
  8.    }   
  9.    public void showWithAster() {   
  10.     System.out.println("*"+string +"*");   
  11.   }   
  12. }  
Print类
  1. public interface Print {   
  2.   public abstract void printWeak();   
  3.   public abstract void printStrong();   
  4. }  
PrintBanner 类
  1. public class PrintBanner extends Banner implements Print {   
  2.    public PrintBanner(String string) {   
  3.        super(string);   
  4.  }   
  5.  public void  printWeak() {   
  6.     showWithParen();   
  7.   }   
  8.   public void printStrong() {   
  9.   showWithActer();   
  10.   }   
  11. }  
Main 测试类
  1. public class Main {   
  2.   public static void  main(String[] args) {   
  3.     Print p = new PrintBanner("Hello");   
  4.     p.printWeak();   
  5.     p.printStrong();   
  6.  }   
  7. }  
评论
qqwjz 2007-07-10
封装“变化”
zhangsheng79 2007-07-09
不评价,建议好好看看设计模式的目的
qqwjz 2007-07-09
akun_007 写道
是不是可以粗略的认为,一个子类继承他父类的同时又实现了某个接口(它同时就具有了父类和接口的特性),就可以说这个子类是他父类和这个接口的“适配器类”了?


你说的情况是“类的Adapter”,换成“对象的Adapter”就不是这个样式了。我个人觉得引入适配器的目的是为了在不改变主程序(除了New对象之外)前提下,添加新的功能,当然这个新的功能可以是你即将要写的,也可以是集成和兼容已经有的功能。本质上是一个面向接口编程的思想。
kevinStar 2007-01-18
qingzi2534 写道
本示例中,在建立PrintBanner类的对象时,把它指定到Print类变量,即:
print p = new PrintBanner("Hello");
为什么不采取下面这个制定到PrintBanner类变量的做法呢?
PrintBanner p = new PrintBanner("Hello");


调用统一,方便业务拓展。可能将来你还要有打印printcard类。
你举的例子是类适配器,还有对象适配器。
qingzi2534 2007-01-18
我也是初学者,现在才看了几个模式而已,只有懂得了怎么用它,才是真正的掌握。希望大家都说说自己的理解,这样才能共同进步啊。
akun_007 2007-01-18
qingzi2534 写道
akun_007 写道
是不是可以粗略的认为,一个子类继承他父类的同时又实现了某个接口(它同时就具有了父类和接口的特性),就可以说这个子类是他父类和这个接口的“适配器类”了?

你一个“粗略”把适配器的精髓都去掉了,如果这么简单的认为,就没有这么多设计模式了。
如果用适配器这种模式,可以降低代码的耦合度。
比如,从Main类的源代码就完全看不出有Banner类,showWithParen方法,showWithAster方法。
换个说法,如果你要改输出的格式,只需要改PrintBanner类就可以了,Main类完全不用改变。


谢谢qingzi2534,我对设计模式的学习和积累不是很多,现在正在学习你的文章。
deafwolf 2007-01-17
设计模式是按作用分的,看代码的话,基本都是adapter或者bridge
而且我一向认为模式是重构出来的
qingzi2534 2007-01-17
akun_007 写道
是不是可以粗略的认为,一个子类继承他父类的同时又实现了某个接口(它同时就具有了父类和接口的特性),就可以说这个子类是他父类和这个接口的“适配器类”了?

你一个“粗略”把适配器的精髓都去掉了,如果这么简单的认为,就没有这么多设计模式了。
如果用适配器这种模式,可以降低代码的耦合度。
比如,从Main类的源代码就完全看不出有Banner类,showWithParen方法,showWithAster方法。
换个说法,如果你要改输出的格式,只需要改PrintBanner类就可以了,Main类完全不用改变。
cui09 2007-01-17
在你的例子中,PrintBanner和Print接口所提供的方法虽然相同,但在某些情形下,PrintBanner类的方法可能会比较多,这个例子的用意很明显,是先将其指定到Print类型变量后再使用,其实是要利用Print接口的方法,而不是PrintBanner类的方法。
akun_007 2007-01-17
是不是可以粗略的认为,一个子类继承他父类的同时又实现了某个接口(它同时就具有了父类和接口的特性),就可以说这个子类是他父类和这个接口的“适配器类”了?
qingzi2534 2007-01-17
本示例中,在建立PrintBanner类的对象时,把它指定到Print类变量,即:
print p = new PrintBanner("Hello");
为什么不采取下面这个制定到PrintBanner类变量的做法呢?
PrintBanner p = new PrintBanner("Hello");
wenjixiao 2007-01-16
见不着女的,见着一个,支持一下。
qingzi2534
搜索本博客
我的相册
E8359ebd-283d-30a6-a7f9-cc18d4e2e902-thumb
200804090708271400855637
共 39 张
存档
最新评论