一天一個設計模式——Adapter適配器模式(Wrapper模式)

1、模式說明設計模式

  在現實生活中,當須要將兩種設備鏈接起來,可是兩個設備的接口規範又不一致(好比電腦上只有Type-C接口,可是你的顯示器是HDMI接口),這時候就須要一個適配器,適配器一端鏈接電腦,一端鏈接屏幕。有了這個適配器,咱們不須要從新買HDMI接口電腦的電腦,就能夠達到咱們鏈接外置顯示器的目的。app

  在程序設計領域,不少時候咱們的工做是在現有類的基礎上繼續開發的,若是這個類已經實現了咱們要的功能且該類通過充分測試(修改它可能會引入bug),可是接口不符合當前程序環境規範,須要適當轉換,這時就用到了Adapter模式的設計思想,建立一個Adapter適配器(Wrapper包裝器),使原有的類能適應新的程序環境。ide

2、模式分類測試

Adapter模式有如下兩種:this

  • 類適配器模式(使用繼承的適配器)

  • 對象適配器模式(使用委託的適配器)

3、適配器模式中的角色spa

  • Target對象:負責定義所須要的方法,具體的業務需求(如上面例子中的HDMI視頻接口);
  • Client請求者:負責使用Target角色定義的方法作具體處理(如上面例子中的顯示器,使用Target提供的HDMI接口來顯示圖像);
  • Adaptee被適配:一個持有既定方法的角色(如面例子中的筆記本電腦,持有Type-C接口輸出);
  • Adapter適配器:Adapter模式的主人公,使用Adaptee的方法來知足Target的需求;

4、代碼示例設計

使用繼承的類適配器:3d

TypeCVideo類(Adaptee):code

package com.designpattern.cn.adapterpattern;

public class TypeCVideo {
    private String videoContent;

    public TypeCVideo(String videoContent){
        this.videoContent = videoContent;
    }

    public void typecOut(){
        System.out.println(videoContent);
    }
}
View Code

ShowHdmiVideo類(Target對象):視頻

package com.designpattern.cn.adapterpattern;

public interface ShowHdmiVideo {
    public abstract void HdmiOut();
}
View Code

TypeCToHdmiCable類(Adapter類):

package com.designpattern.cn.adapterpattern;

/**
 * <p>TypeCToHdmiCable TypeC轉HDMI線 適配器類</p>
 */
public class TypeCToHdmiCable extends TypeCVideo implements ShowHdmiVideo {

    //TypeC轉HDMI線 TypeCToHdmiCable類繼承了TypeCVideo類
    public TypeCToHdmiCable(String videoContent){
        super(videoContent);//設置父類的視頻內容videoContent字段
    }
    @Override
    public void HdmiOut() {
        typecOut();
    }
}
View Code

測試運行結果:

上面的例子,經過繼承TypeCVideo的方式建立新的類,並實現新業務須要的HDMI接口,從而將TypeC中視頻流(Video Streaming字符串)從HDMI接口輸出處來。

 

使用委託的對象適配器模式:

【委託:委託的意思就是交給他人,本身由於某些緣由作不了的事情,將事情吩咐給別人作,在JAVA中,委託就是將某個方法中的實際處理交給其餘實例的方法】

將上述ShowHdmiVideo接口改成ShowHdmiVideo類:

package com.designpattern.cn.adapterpattern;

public abstract class ShowHdmiVideo{
    public abstract void HdmiOut();
}
View Code

TypeCToHdmi適配器類修改以下:

package com.designpattern.cn.adapterpattern;

/**
 * <p>TypeCToHdmiCable TypeC轉HDMI線 適配器類</p>
 */
public class TypeCToHdmiCable extends ShowHdmiVideo {
    private TypeCVideo typeCVideo;

    public TypeCToHdmiCable(String videoContent){
        this.typeCVideo = new TypeCVideo(videoContent);
    }

    //當適配器HDMI視頻輸出方法被調用的時候,並非TypeCToHdmiCable這個適配器類本身進行處理,而是交給了TypeCVideo類實例的typec輸出
    public void HdmiOut() {
        typeCVideo.typecOut();
    }
}
View Code

其餘定義保持不變,再次運行程序,結果相同:

 

5、相關的設計模式:

  • Bridge橋接模式:Adapter模式用於鏈接兩個接口不一樣的類;而Bridge模式用於鏈接類的功能層次結構與實現層次結構。
  • Decorator裝飾器模式:Adapter模式用於填補不一樣接口之間的縫隙(接口不兼容),而Decorator裝飾器模式用於在不改變API接口的前提下,加強功能(Spring中的IO流,數據源,都使用了Decorator模式包裝)。
相關文章
相關標籤/搜索