中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > 设计模式
设计模式袖珍版 连续转载之 - Adapter(适配器)
作者:未知 时间:2005-07-24 21:24 出处:JR 责编:chinaitpower
              摘要:设计模式袖珍版 连续转载之 - Adapter(适配器)
原作:fanix

定义:
将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份.

为何使用?
我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口。 怎么办? 

使用Adapter,在这两种接口之间创建一个混合接口(混血儿).

如何使用?
实现Adapter方式,其实"think in Java"的"类再生"一节中已经提到,有两种方式:组合(composition)和继承(inheritance).


假设我们要打桩,有两种类:方形桩 圆形桩.
程序代码:

  1. public class SquarePeg{
  2.   public void insert(String str){
  3.     System.out.println("SquarePeg insert():"+str);
  4.   }
  5. }
  6. public class RoundPeg{
  7.   public void insertIntohole(String msg){
  8.     System.out.println("RoundPeg insertIntoHole():"+msg);
  9. }
  10. }


现在有一个应用,需要既打方形桩,又打圆形桩.那么我们需要将这两个没有关系的类综合应用.假设RoundPeg我们没有源代码,或源代码我们不想修改,那么我们使用Adapter来实现这个应用:
程序代码:

  1. public class PegAdapter extends SquarePeg{
  2.   private RoundPeg roundPeg;
  3.   public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)
  4.   public void insert(String str){ roundPeg.insertIntoHole(str);}
  5. }


在上面代码中,RoundPeg属于Adaptee,是被适配者.PegAdapter是Adapter,将Adaptee(被适配者RoundPeg)和Target(目标SquarePeg)进行适配.实际上这是将组合方法(composition)和继承(inheritance)方法综合运用.

PegAdapter首先继承SquarePeg,然后使用new的组合生成对象方式,生成RoundPeg的对象roundPeg,再重载父类insert()方法。从这里,你也了解使用new生成对象和使用extends继承生成对象的不同,前者无需对原来的类修改,甚至无需要知道其内部结构和源代码.

如果你有些Java使用的经验,已经发现,这种模式经常使用。

进一步使用
上面的PegAdapter是继承了SquarePeg,如果我们需要两边继承,即继承SquarePeg 又继承RoundPeg,因为Java中不允许多继承,但是我们可以实现(implements)两个接口(interface)
程序代码:

  1. public interface IRoundPeg{
  2.   public void insertIntoHole(String msg);
  3. }
  4. public interface ISquarePeg{
  5.   public void insert(String str);
  6. }


下面是新的RoundPeg 和SquarePeg, 除了实现接口这一区别,和上面的没什么区别。
程序代码:

  1. public class SquarePeg implements ISquarePeg{
  2.   public void insert(String str){
  3.     System.out.println("SquarePeg insert():"+str);
  4.   }
  5. }
  6. public class RoundPeg implements IRoundPeg{
  7.   public void insertIntohole(String msg){
  8.     System.out.println("RoundPeg insertIntoHole():"+msg);
  9.   }
  10. }


下面是新的PegAdapter,叫做two-way adapter:
程序代码:

  1. public class PegAdapter implements IRoundPeg,ISquarePeg{
  2.   private RoundPeg roundPeg;
  3.   private SquarePeg squarePeg;
  4.   // 构造方法
  5.   public PegAdapter(RoundPeg peg){this.roundPeg=peg;}
  6.   // 构造方法
  7.   public PegAdapter(SquarePeg peg)(this.squarePeg=peg;)
  8.   public void insert(String str){ roundPeg.insertIntoHole(str);}
  9. }

还有一种叫Pluggable Adapters,可以动态的获取几个adapters中一个。使用Reflection技术,可以动态的发现类中的Public方法。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有