论坛首页 Java企业应用论坛

设计模式之适配器 Adapter

浏览 8086 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-16  
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. }  
   发表时间:2007-01-16  
见不着女的,见着一个,支持一下。
0 请登录后投票
   发表时间:2007-01-17  
本示例中,在建立PrintBanner类的对象时,把它指定到Print类变量,即:
print  p = new PrintBanner("Hello");
为什么不采取下面这个制定到PrintBanner类变量的做法呢?
PrintBanner p = new PrintBanner("Hello");
0 请登录后投票
   发表时间:2007-01-17  
是不是可以粗略的认为,一个子类继承他父类的同时又实现了某个接口(它同时就具有了父类和接口的特性),就可以说这个子类是他父类和这个接口的“适配器类”了?
0 请登录后投票
   发表时间:2007-01-17  
在你的例子中,PrintBanner和Print接口所提供的方法虽然相同,但在某些情形下,PrintBanner类的方法可能会比较多,这个例子的用意很明显,是先将其指定到Print类型变量后再使用,其实是要利用Print接口的方法,而不是PrintBanner类的方法。
0 请登录后投票
   发表时间:2007-01-17  
akun_007 写道
是不是可以粗略的认为,一个子类继承他父类的同时又实现了某个接口(它同时就具有了父类和接口的特性),就可以说这个子类是他父类和这个接口的“适配器类”了?

你一个“粗略”把适配器的精髓都去掉了,如果这么简单的认为,就没有这么多设计模式了。
如果用适配器这种模式,可以降低代码的耦合度。
比如,从Main类的源代码就完全看不出有Banner类,showWithParen方法,showWithAster方法。
换个说法,如果你要改输出的格式,只需要改PrintBanner类就可以了,Main类完全不用改变。
0 请登录后投票
   发表时间:2007-01-17  
设计模式是按作用分的,看代码的话,基本都是adapter或者bridge
而且我一向认为模式是重构出来的
0 请登录后投票
   发表时间:2007-01-18  
qingzi2534 写道
akun_007 写道
是不是可以粗略的认为,一个子类继承他父类的同时又实现了某个接口(它同时就具有了父类和接口的特性),就可以说这个子类是他父类和这个接口的“适配器类”了?

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


谢谢qingzi2534,我对设计模式的学习和积累不是很多,现在正在学习你的文章。
0 请登录后投票
   发表时间:2007-01-18  
我也是初学者,现在才看了几个模式而已,只有懂得了怎么用它,才是真正的掌握。希望大家都说说自己的理解,这样才能共同进步啊。
0 请登录后投票
   发表时间:2007-01-18  
qingzi2534 写道
本示例中,在建立PrintBanner类的对象时,把它指定到Print类变量,即:
print  p = new PrintBanner("Hello");
为什么不采取下面这个制定到PrintBanner类变量的做法呢?
PrintBanner p = new PrintBanner("Hello");


调用统一,方便业务拓展。可能将来你还要有打印printcard类。
你举的例子是类适配器,还有对象适配器。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics