1. 程式人生 > 其它 >Java中的23個設計模式 【結構型模式】 中的 【介面卡模式】

Java中的23個設計模式 【結構型模式】 中的 【介面卡模式】

技術標籤:設計模型設計模式java大資料程式語言zookeeper

文章目錄

設計模式分類

  • 建立型模式
    • 單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式
    • 關注物件的建立過程
  • 結構型模式
    • 介面卡模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式
    • 關注物件和類的組織
  • 行為型模式
    • 模板方法模式、命令模式、迭代器模式、觀察者模式、中介模式、備忘錄模式、直譯器模式、狀態模式、策略模式、責任鏈模式、訪問者模式
    • 關注系統同對象之間的相互互動,研究系統在執行時物件之間的相互通訊和協作,進一步明確物件的職責

介面卡(adapter)模式

  • 什麼是介面卡模式
    • 將一個類的介面轉換成客戶希望的另外一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以在一起工作
  • 模式中的角色
    • 目標介面(Target):客戶所期待的介面,目標可以是具體的或抽象的類,也可以是介面
    • 需要適配的類(Adaptee):需要適配的類或適配者類
    • 介面卡(Adapter):通過包裝一個需要適配的物件,把原介面轉換成目標介面
  • 工作中的場景
    • 經常用來做舊系統改造和升級
    • 如果我們的系統開發之後再也不需要維護,那麼很多模式都是沒必要的,但是不幸的是,事實卻是維護一個系統的代價往往是開發一個系統的數倍
  • 學習中見過的場景
    • java.io.InputStreamReader(InputStream)
    • java.io.OutputStreamWriter(OutputStream)

程式碼

  • 例子:
    • 舊鍵盤使用的是ps/2介面,現在筆記本只有usb介面,需要一個介面卡才能使用舊鍵盤
  • 需要的類
    • 被適配者(Adaptee)
    • 介面卡(Adapter)[定義介面卡介面(Target)以滿足可以構建多個不同的介面卡]
    • 客戶端(Client)
  • 被適配者(Adaptee)

    package adapter;
    
    /**
     * 被適配的類
     * @author 橙汁兒Drk
     *
     */
    
    public class Adaptee {
    
    	public void request() {
    		System.out.
    println("可以完成客戶請求的需要的功能!"); } }
  • 介面卡介面(Target)

    package adapter;
    
    public interface Target {
    
    	void handleReq();
    }
    
    
  • 介面卡本身(Adapter)兩種方式

    • 類介面卡,只能繼承一個類
    package adapter;
    
    /**
     * 介面卡本身(類介面卡方式)
     * (相當於usb和ps/2的轉接器)
     * @author 橙汁兒Drk
     *
     */
    public class Adapter extends Adaptee implements Target{
    
    	@Override
    	public void handleReq() {
    		super.request();
    	}
    
    	
    }
    
    
    • 物件介面卡,使用了組合的方式跟介面卡物件整合
    package adapter;
    
    /**
     * 介面卡本身(物件介面卡方式,使用了組合的方式跟介面卡物件整合)
     * (相當於usb和ps/2的轉接器)
     * @author 橙汁兒Drk
     *
     */
    public class Adapter2 implements Target{
    
    	private Adaptee adaptee;
    	
    	@Override
    	public void handleReq() {
    		adaptee.request();
    	}
    
    	public Adapter2(Adaptee adaptee) {
    		super();
    		this.adaptee = adaptee;
    	}
    	
    }
    
    
  • 客戶端

    例子中的筆記本,只有usb介面

    package adapter;
    
    /**
     * 客戶端類
     * (相當於例子中的筆記本,只有USB介面)
     * @author 橙汁兒Drk
     *
     */
    
    public class Client {
    
    	public void test1(Target t) {
    		t.handleReq();
    	}
    	
    	public static void main(String[] args) {
    		Client c = new Client();
    		Adaptee a = new Adaptee();
    		
            //Target t = new Adapter();
    		Target t = new Adapter2(a);
    		
    		c.test1(t);
    		
    	}
    }