1. 程式人生 > 其它 >h5 android 個別機型, fixed 佈局被軟鍵盤頂上去,遮擋輸入框

h5 android 個別機型, fixed 佈局被軟鍵盤頂上去,遮擋輸入框

介面卡模式也叫包裝器,屬於結構型模式;就是把一個類的介面變換成客戶端所期待的另一種介面,從而使原本因介面不匹配而無法在一起共組的兩個類能夠在一起工作,介面卡模式的主要目的就是相容性。介面卡模式主要分為兩類:類介面卡模式物件介面卡模式

都知道中國的生活用電電壓是220V,而我們的智慧手機充電器的輸出電壓是5V,那麼手機充電器就是一個把220V高壓交流電轉為低壓直流電的一個介面卡。在本模式中,就使用這個來作為例子。

類介面卡模式:

類介面卡模式就是把被適配的類的API轉換成為目標類的API。

類介面卡模式的UML類圖如下:

這種模式所涉及到目標角色、源角色、介面卡角色以下幾種角色:

  • 目標角色:這就是所期待得到的角色。由於這裡討論的是類介面卡模式,所以目標角色不可以是類,應該是一個介面
  • 源角色:需要適配的介面
  • 介面卡角色:介面卡角色是本模式的核心,介面卡把源介面轉換成目標介面。所以這一角色必須是一個具體的類

源角色:

package com.charon.adapter;

/**
 * @className: Voltage220V
 * @description: 源適配角色,220v電壓
 * @author: charon
 * @create: 2022-03-14 23:12
 */
public class Voltage220V {

    public int output220V(){
        int voltage = 220;
        System.out.println("電壓 " + voltage + " 伏");
        return voltage;
    }
}

目標角色:

package com.charon.adapter;

/**
 * @className: Voltage5V
 * @description: 5v的適配介面
 * @author: charon
 * @create: 2022-03-14 23:09
 */
public interface Voltage5V {

    /**
     * 輸出5V電壓
     * @return
     */
    public int output5V();
}

介面卡角色:

package com.charon.adapter;

/**
 * @className: VoltageAdaptor
 * @description: 電壓介面卡角色
 * @author: charon
 * @create: 2022-03-15 21:36
 */
public class VoltageAdaptor extends Voltage220V implements Voltage5V {
    @Override
    public int output5V() {
        int voltage = output220V();
        return voltage / 44;
    }
}

使用者:

package com.charon.adapter;

/**
 * @className: Phone
 * @description: 使用者
 * @author: charon
 * @create: 2022-03-15 21:37
 */
public class Phone {

    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charging(new VoltageAdaptor());
    }
    
    public void charging(Voltage5V voltage5V){
        if(5 == voltage5V.output5V()){
            System.out.println("電壓為5V,可以進行充電~~~");
        }else if(voltage5V.output5V() > 5){
            System.out.println("電壓大於5V,不可以進行充電~~~");
        }
    }
}

類介面卡模式優缺點:

  1. 由於介面卡類是源的子類,因此可以在介面卡類中重寫源角色的一些方法
  2. 由於只引進一個介面卡類,因此只有一個路線到達目標類,使問題得到簡化
  3. 正是由於介面卡類是源角色的子類,而java是單繼承的,如果有多個源需要適配,那這種方式就太過於繁瑣了

物件介面卡模式:

與類介面卡模式一樣,物件介面卡模式是把被適配的類的API轉換成目標類的API,與類介面卡模式不同的是,物件介面卡模式不是使用繼承關係連線到Adaptee(源角色)類的,而是使用委派關係連線到Adaptee(源角色)類。即根據“合成複用原則”中的使用關聯關係代替繼承關係

物件介面卡模式的UML類圖如下:

物件介面卡模式涉及到的角色和類介面卡涉及到的角色一致。

相應的程式碼也差不多,唯一的區別在於介面卡角色:

package com.charon.adapter;

/**
 * @className: VoltageAdaptor1
 * @description: 物件介面卡模式
 * @author: charon
 * @create: 2022-03-15 22:04
 */
public class VoltageAdaptor1 implements Voltage5V{
    private Voltage220V voltage220V;

    /**
     * 通過構造器傳入一個Voltage220V的物件例項
     * @param voltage220V
     */
    public VoltageAdaptor1(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        int outputV = 0;
        if(null != voltage220V){
            int inputV = voltage220V.output220V();
            outputV = inputV / 44;
        }
        return outputV;
    }
}

測試:

package com.charon.adapter;

/**
 * @className: Phone
 * @description: 使用者
 * @author: charon
 * @create: 2022-03-15 21:37
 */
public class Phone {

    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.charging(new VoltageAdaptor1(new Voltage220V()));
    }

    public void charging(Voltage5V voltage5V){
        if(5 == voltage5V.output5V()){
            System.out.println("電壓為5V,可以進行充電~~~");
        }else if(voltage5V.output5V() > 5){
            System.out.println("電壓大於5V,不可以進行充電~~~");
        }
    }
}

列印:
    電壓 220 伏
    電壓為5V,可以進行充電~~~

物件介面卡模式的優缺點:

  1. 一個介面卡可以把多種不同的源角色適配到同一個目標角色,換言之,同一個介面卡可以把源類和它的子類都適配到目標介面
  2. 與類介面卡模式相比,要想置換源類的方法就不容易,如果一個要置換掉源類的一個或多個方法,就只好先做一個源類的子類,將源類的方法置換掉,然後再把源類的子類當作真正的源進行適配
  3. 雖然要想置換源類的方法不容易,但是要想增加一些新的方法則方便的很,而且新增加的方法可同時適用於所有的源

在什麼情況下使用介面卡模式:

  1. 系統需要使用現有的類,而此類的介面不符合系統的需要
  2. 想要建立一個可以重複使用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起工作,這些源類不一定有很複雜的介面
  3. 對於物件介面卡模式而言,在設計裡。需要改變多個已有的子類的介面,如果使用類的介面卡模式,就要針對每一個子類做一個介面卡類,而這不太實際