設計模式之Adapter(適配器)

定義 :
將兩個不相容的類別糾合在一起使用,屬於結構型模式 , 需要有 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 方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值