1. 程式人生 > 其它 >Java 設計模式之介面卡模式,Java 類介面卡,Java 物件介面卡

Java 設計模式之介面卡模式,Java 類介面卡,Java 物件介面卡

Java 設計模式之介面卡模式,

Java 類介面卡,

Java 物件介面卡

================================

©Copyright 蕃薯耀2021-06-30

https://www.cnblogs.com/fanshuyao/

一、類介面卡

1、目標介面

public interface IVoltage {

    public int output();
}

2、目標類

public class Voltage220 implements IVoltage{

    @Override
    public int output() {
        System.out.println(
"電源輸出220V電壓"); return 220; } }

3、類介面卡(介面卡英文是:Adapter,非Adaptor,示例中寫錯了)

/**
 * 類介面卡,通過繼承目標類(Voltage220)和實現目標介面(IVoltage)
 *
 */
public class Voltage10Adaptor extends Voltage220 implements IVoltage{

    @Override
    public int output() {
        int v220 = super.output();
        int v10 = v220 / 22;
        System.out.println(
"介面卡輸出"+ v10 +"V電壓"); return v10; } }

4、手機類

public class Mobile {

    private IVoltage iVoltage;
    
    
    public IVoltage getiVoltage() {
        return iVoltage;
    }


    public void setiVoltage(IVoltage iVoltage) {
        this.iVoltage = iVoltage;
    }
    
    
    public
Mobile(IVoltage iVoltage) { super(); this.iVoltage = iVoltage; } //充電 public void charge() { if(this.iVoltage.output() != 10) { System.out.println("電壓(" + this.iVoltage.output() + ")不匹配,手機不能充電"); }else { System.out.println("手機正在充電…"); } } }

5、客戶端測試類

public class Client {

    public static void main(String[] args) {
        
        
        
        Voltage220 voltage220 = new Voltage220();
        //voltage220.output();
        
        Mobile m = new Mobile(voltage220);
        m.charge();
        
        
        System.out.println("-------------------------------");
        
        
        Mobile m2 = new Mobile(new Voltage10Adaptor());
        m2.charge();
    }
}

測試結果:

電源輸出220V電壓
電源輸出220V電壓
電壓(220)不匹配,手機不能充電
-------------------------------
電源輸出220V電壓
介面卡輸出10V電壓
手機正在充電…

二、物件介面卡

1、物件介面卡類

/**
 * 物件介面卡,就是不繼承目標類,而是通過在介面卡中增加目標類的物件,以構造方法注入物件的方式,解決類只能單繼承的問題,因為介面卡如果繼承了其它類,就不能再繼承目標類
 *
 */
public class Voltage10AdaptorObject implements IVoltage{

    private IVoltage iVoltage;

    public Voltage10AdaptorObject(IVoltage iVoltage) {
        this.iVoltage = iVoltage;
    }


    @Override
    public int output() {
        int vTarget = this.iVoltage.output();
        int vAdaptor = 0;
        
        if(vTarget == 220) {
            vAdaptor = vTarget / 22;
            
        }else if(vTarget == 110) {
            vAdaptor = vTarget / 11;
        }
        
        System.out.println("介面卡輸出"+ vAdaptor +"V電壓");
        return vAdaptor;
    }

}

2、客戶端測試類

public class Client {

    public static void main(String[] args) {
        
        
        
        Voltage220 voltage220 = new Voltage220();
        //voltage220.output();
        
        Mobile m = new Mobile(voltage220);
        m.charge();
        
        
        System.out.println("-------------------------------");
        
        
        Mobile m2 = new Mobile(new Voltage10Adaptor());
        m2.charge();
        
        System.out.println("+++++++++++++++++++++++++++++");
        
        
        Mobile m3 = new Mobile(new Voltage10AdaptorObject(voltage220));
        m3.charge();
    }
}

測試結果:

電源輸出220V電壓
電源輸出220V電壓
電壓(220)不匹配,手機不能充電
-------------------------------
電源輸出220V電壓
介面卡輸出10V電壓
手機正在充電…
+++++++++++++++++++++++++++++
電源輸出220V電壓
介面卡輸出10V電壓
手機正在充電…

三、總結

介面卡模式(Adapter Pattern)

三個角色:

1:Target(目標抽象類):目標抽象類定義客戶所需的介面,可以是一個抽象類或介面,一般是介面,因為類是單繼承(不好)。

2:Adaptee(適配者類):適配者即需要被適配的角色,它定義了一個已經存在的介面(方法),這個介面需要適配。

3:Adapter(介面卡類):作為一個轉換器,需要實現Target類,對Adaptee和Target進行適配。它是介面卡模式的核心。

儘量使用物件的介面卡模式,多用合成/聚合、少用繼承。

對於類介面卡,介面卡可以重定義的部分行為,相當於子類覆蓋父類的部分實現方法。

(時間寶貴,分享不易,捐贈回饋,^_^)

================================

©Copyright 蕃薯耀2021-06-30

https://www.cnblogs.com/fanshuyao/