設計模式之Adapter(適配器)

原创 2004年06月24日 19:52:00

定義:
將兩個不相容的類別糾合在一起使用,屬於結構型模式,需要有Adaptee(被適配者)Adaptor(適配器)兩個身份。

爲何使用?
我們經常碰到要將兩個沒有關係的類別組合在一起使用,第一解決方案是:修改各自類別的介面,但是如果我們沒有源代碼,或者,我們不願意爲了一個應用而修改各自的介面。 怎麽辦?

使用Adapter,在這兩種介面之間創建一個混合介面(混血兒)

如何使用?
實現Adapter方式,其實"think in Java""類別再生"一節中已經提到,有兩種方式:組合(composition)和繼承(inheritance)


假設我們要打樁,有兩種類別:方形樁 圓形樁。
public class SquarePeg{
  public void insert(String str){
    
System.out.println("SquarePeg insert():"+str);
  }

}

public class RoundPeg{
  
public void insertIntohole(String msg){
    
System.out.println("RoundPeg insertIntoHole():"+msg);
}
}

現在有一個應用,需要既打方形樁,又打圓形樁。那麽我們需要將這兩個沒有關係的類別綜合應用。假設RoundPeg我們沒有源代碼,或源代碼我們不想修改,那麽我們使用Adapter來實現這個應用:

public class PegAdapter extends SquarePeg{

  private RoundPeg roundPeg;

  public PegAdapter(RoundPeg peg)(this.roundPeg=peg;)

  public void insert(String str){ roundPeg.insertIntoHole(str);}

}

在上面代碼中,RoundPeg屬於Adaptee,是被適配者。PegAdapterAdapter,Adaptee(被適配者RoundPeg)Target(目標SquarePeg)進行適配。實際上這是將組合方法(composition)和繼承(inheritance)方法綜合運用。

PegAdapter首先繼承SquarePeg,然後使用new的組合生成物件方式,生成RoundPeg的物件roundPeg,再重載父類別insert()方法。從這裏,你也瞭解使用new生成物件和使用extends繼承生成物件的不同,前者無需對原來的類別修改,甚至無需要知道其內部結構和源代碼。

如果你有些Java使用的經驗,已經發現,這種模式經常使用。

進一步使用
上面的PegAdapter是繼承了SquarePeg,如果我們需要兩邊繼承,即繼承SquarePeg 又繼承RoundPeg,因爲Java中不允許多繼承,但是我們可以實現(implements)兩個介面(interface)

public interface IRoundPeg{
  
public void insertIntoHole(String msg);

}

public interface ISquarePeg{
  public void insert(String str);

}

下面是新的RoundPeg SquarePeg, 除了實現介面這一區別,和上面的沒什麽區別。
public class SquarePeg implements IRoundPeg{
  public void insert(String str){
    
System.out.println("SquarePeg insert():"+str);
  }

}

public class RoundPeg implements ISquarePeg{
  
public void insertIntohole(String msg){
    
System.out.println("RoundPeg insertIntoHole():"+msg);
  
}
}

下面是新的PegAdapter,叫做two-way adapter:

public class PegAdapter implements IRoundPeg,ISquarePeg{

  
private RoundPeg roundPeg;
  
private SquarePeg squarePeg;

  // 構造方法

  public PegAdapter(RoundPeg peg){this.roundPeg=peg;}
  // 構造方法

  public PegAdapter(SquarePeg peg)(this.squarePeg=peg;)

  public void insert(String str){ roundPeg.insertIntoHole(str);}

}

還有一種叫Pluggable Adapters,可以動態的獲取幾個adapters中一個。使用Reflection技術,可以動態的發現類別中的Public方法。

設計模式之Adapter(適配器)

定義:將兩個不相容的類別糾合在一起使用,屬於結構型模式,需要有Adaptee(被適配者)和Adaptor(適配器)兩個身份。爲何使用?我們經常碰到要將兩個沒有關係的類別組合在一起使用,第一解決方案是:...
  • alex197963
  • alex197963
  • 2007年05月12日 09:26
  • 674

android通用適配器

一.需求分析 在平常的android開發過程中,ListView、GridView適配的編寫是一件很麻煩而且很重複的事情,每次都需要考慮性能的優化、item的編寫、獲取網絡圖片時候信息的錯亂等問題,因...
  • ITbailei
  • ITbailei
  • 2014年10月27日 10:35
  • 1171

设计模式-设配器模式

适配器模式 将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作   【适用性】 1、你想使用一个已经存在的类,而它的接口不符...
  • MrCoders
  • MrCoders
  • 2017年02月10日 11:26
  • 353

java策略之选配器模式Adapter

参照:http://www.cnblogs.com/forlina/archive/2011/06/27/2091105.html 1、核心意图:     将一个类的接口转换成客户希望的另外一个接...
  • chairv
  • chairv
  • 2016年10月18日 23:43
  • 89

Java设计模式----适配器模式

1. 适配器模式简介      适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。      ...
  • ymeng_bupt
  • ymeng_bupt
  • 2011年09月29日 12:42
  • 9472

大话西游之设计模式_起手篇

介绍了设计模式是什么。能干什么、及怎么运用? 通过西游记中故事的分析,将常用设计模式融合在故事的实现中,帮助大家理解&记住各种设计模式的概念及使用方法。 达到活学活用的情况~...
  • myhc2014
  • myhc2014
  • 2015年10月15日 10:52
  • 746

设计模式(二) 三种适配器模式 总结和使用场景

转载请标明出处: http://blog.csdn.net/zxt0601/article/details/52703280本文出自:【张旭童的博客】一 概述定义:适配器模式将某个类的接口转换成客...
  • zxt0601
  • zxt0601
  • 2016年10月18日 16:34
  • 3974

Android框架设计模式(四)——Adapter Method

我们使用适配器的本质原因是:当我们的系统已经确定了一个标准,但已有的资源与现有标准不兼容,而且又无法或者不便修改这个标准的时候,就需要用适配器来使得不兼容的被使用方包装成已有的标准供已有的系统使用。...
  • woshimalingyi
  • woshimalingyi
  • 2016年04月04日 00:31
  • 1833

設計模式之Observer

Java深入到一定程度,就不可避免的碰到設計模式(design pattern)這一概念,瞭解設計模式,將使自己對java中的介面或抽象類別應用有更深的理解。設計模式在java的中型系統中應用廣泛,遵...
  • arielxp
  • arielxp
  • 2004年06月24日 20:06
  • 2312

設計模式之Template

Template定義:定義一個操作中演算法的骨架,將一些步驟的執行延遲到其子類別中。 其實Java的抽象類別本來就是Template模式,因此使用很普遍。而且很容易理解和使用,我們直接以示例開始: ...
  • arielxp
  • arielxp
  • 2004年06月24日 19:57
  • 1797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:設計模式之Adapter(適配器)
举报原因:
原因补充:

(最多只允许输入30个字)