熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

java設計模式之 Adapter(糾合不兼容的類)

2013-11-23 19:53:49  來源: Java高級技術 

  定義:
  將兩個不兼容的類糾合在一起使用屬於結構型模式需要有Adaptee(被適配者)和Adaptor(適配器)兩個身份
  
  為何使用?
  我們經常碰到要將兩個沒有關系的類組合在一起使用第一解決方案是修改各自類的接口但是如果我們沒有源代碼或者我們不願意為了一個應用而修改各自的接口 怎麼辦?
  
  使用Adapter在這兩種接口之間創建一個混合接口(混血兒)
  
  如何使用?
  實現Adapter方式其實think in Java類再生一節中已經提到有兩種方式組合(composition)和繼承(inheritance)
  
  假設我們要打樁有兩種類方形樁 圓形樁
  public class SquarePeg{
    public void insert(String str){
      Systemoutprintln(SquarePeg insert():+str);
    }
  
  }
  
  public class RoundPeg{
    public void insertIntohole(String msg){
      Systemoutprintln(RoundPeg insertIntoHole():+msg);
  }
  }
  
  現在有一個應用需要既打方形樁又打圓形樁那麼我們需要將這兩個沒有關系的類綜合應用假設RoundPeg我們沒有源代碼或源代碼我們不想修改那麼我們使用Adapter來實現這個應用:
  
  public class PegAdapter extends SquarePeg{
  
    private RoundPeg roundPeg;
  
    public PegAdapter(RoundPeg peg)(thisroundPeg=peg;)
  
    public void insert(String str){ roundPeginsertIntoHole(str);}
  
  }
  
  在上面代碼中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)
  
  public interface IRoundPeg{
    public void insertIntoHole(String msg);
  
  }
  
  public interface ISquarePeg{
    public void insert(String str);
  
  }
  
  下面是新的RoundPeg 和SquarePeg 除了實現接口這一區別和上面的沒什麼區別
  public class SquarePeg implements ISquarePeg{
    public void insert(String str){
      Systemoutprintln(SquarePeg insert():+str);
    }
  
  }
  
  public class RoundPeg implements IRoundPeg{
    public void insertIntohole(String msg){
      Systemoutprintln(RoundPeg insertIntoHole():+msg);
    }
  }
  
  下面是新的PegAdapter叫做twoway adapter:
  
  public class PegAdapter implements IRoundPegISquarePeg{
  
    private RoundPeg roundPeg;
    private SquarePeg squarePeg;
  
    // 構造方法
    public PegAdapter(RoundPeg peg){thisroundPeg=peg;}
    // 構造方法
    public PegAdapter(SquarePeg peg)(thissquarePeg=peg;)
  
    public void insert(String str){ roundPeginsertIntoHole(str);}
  
  }
  
  還有一種叫Pluggable Adapters可以動態的獲取幾個adapters中一個使用Reflection技術可以動態的發現類中的Public方法
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27634.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.