設計模式:適配器模式

說明:在不改變舊接口代碼的前提下,爲該接口新增其餘接口的功能java

適配器模式能夠分爲:類適配器模式、對象適配器模式、接口適配器模式ide

前兩種模式下,我會以播放器爲例。老版的播放器(Player)只支持mp4格式的視頻文件,而新版的播放器(AdvancedPlayer)在支持mp4的基礎上還支持rmvb、avi等格式。實現目標:在不改變老版播放器接口文件的前提下,老版的播放器也能支持播放rmvb、avi等格式的視頻文件。函數

1.類適配器模式測試

老版播放器接口代碼及其實現:this

package com.java.pattern.adapter.tclass.demo;

public interface Player {
    void play(String audioType, String audioName);
}
package com.java.pattern.adapter.tclass.demo;

public class PlayerImpl implements Player {

    @Override
    public void play(String audioType, String audioName) {
        if("mp4".equalsIgnoreCase(audioType)) {
            System.out.println("低版本播放器,目前僅支持播放mp4格式的視頻:"+audioName);
        } else {
            System.out.println("低版本播放器,目前僅支持播放mp4格式的視頻,不支持當前格式文件:"+audioName);
        }
    }
}

新版播放器接口及其實現類:code

package com.java.pattern.adapter.tclass.demo;

public interface AdvancedPlayer {

    void playRmvb(String audioName);

    void playAvi(String audioName);

}
package com.java.pattern.adapter.tclass.demo;

public class AdvancedPlayerImpl implements AdvancedPlayer {

    @Override
    public void playRmvb(String audioName) {
        System.out.println("如今開始播放rmvb格式的視頻:"+audioName);
    }

    @Override
    public void playAvi(String audioName) {
        System.out.println("如今開始播放avi格式的視頻:"+audioName);
    }

}

適配器類:視頻

package com.java.pattern.adapter.tclass.demo;

public class PlayerAdapter extends AdvancedPlayerImpl implements Player {

    @Override
    public void play(String audioType, String audioName) {
        if("rmvb".equalsIgnoreCase(audioType)) {
            playRmvb(audioName);
        } else if("avi".equalsIgnoreCase(audioType)) {
            playAvi(audioName);
        } else {
            System.out.println("如今開始播放mp4格式的視頻:"+audioName);
        }
    }

}

測試類:對象

package com.java.pattern.adapter.tclass.demo;

public class Ctest01 {

    public static void main(String[] args) {
        // 舊式的播放器只支持播放mp4格式的視頻文件
        Player mp4Player = new PlayerImpl();
        mp4Player.play("mp4", "適配器模式.mp4");
        mp4Player.play("rmvb", "適配器模式.rmvb");
        mp4Player.play("avi", "適配器模式.avi");
        System.out.println("-----------------------------------");
        // 使用[類適配器]後,能夠兼容rmvb,avi格式的視頻文件
        Player adapterPlayer = new PlayerAdapter();
        adapterPlayer.play("mp4", "適配器模式.mp4");
        adapterPlayer.play("rmvb", "適配器模式.rmvb");
        adapterPlayer.play("avi", "適配器模式.avi");
//        低版本播放器,目前僅支持播放mp4格式的視頻:適配器模式.mp4
//        低版本播放器,目前僅支持播放mp4格式的視頻,不支持當前格式文件:適配器模式.rmvb
//        低版本播放器,目前僅支持播放mp4格式的視頻,不支持當前格式文件:適配器模式.avi
//        -----------------------------------
//        如今開始播放mp4格式的視頻:適配器模式.mp4
//        如今開始播放rmvb格式的視頻:適配器模式.rmvb
//        如今開始播放avi格式的視頻:適配器模式.avi

        /**
         *  實現了在不改變Player接口的前提下,增長了播放rmvb,avi格式文件的功能
         */
    }

}

2.對象適配器模式繼承

老版播放器接口代碼及其實現:接口

package com.java.pattern.adapter.tobj.demo;

public interface Player {
    void play(String audioType, String audioName);
}
package com.java.pattern.adapter.tobj.demo;

public class PlayerImpl implements Player {

    @Override
    public void play(String audioType, String audioName) {
        if("mp4".equalsIgnoreCase(audioType)) {
            System.out.println("低版本播放器,目前僅支持播放mp4格式的視頻:"+audioName);
        } else {
            System.out.println("低版本播放器,目前僅支持播放mp4格式的視頻,不支持當前格式文件:"+audioName);
        }
    }

}

新版播放器接口及其實現類:

package com.java.pattern.adapter.tobj.demo;

public interface AdvancedPlayer {

    void playRmvb(String audioName);

    void playAvi(String audioName);

}
package com.java.pattern.adapter.tobj.demo;

public class AdvancedPlayerImpl implements AdvancedPlayer {

    @Override
    public void playRmvb(String audioName) {
        System.out.println("如今開始播放rmvb格式的視頻:"+audioName);
    }

    @Override
    public void playAvi(String audioName) {
        System.out.println("如今開始播放avi格式的視頻:"+audioName);
    }

}

適配器類:

package com.java.pattern.adapter.tobj.demo;

public class PlayerAdapter implements Player {

    private AdvancedPlayer advancedPlayer;

    public PlayerAdapter(AdvancedPlayer advancedPlayer) {
        this.advancedPlayer = advancedPlayer;
    }

    @Override
    public void play(String audioType, String audioName) {
        if("rmvb".equalsIgnoreCase(audioType)) {
            advancedPlayer.playRmvb(audioName);
        } else if("avi".equalsIgnoreCase(audioType)) {
            advancedPlayer.playAvi(audioName);
        } else {
            System.out.println("如今開始播放mp4格式的視頻:"+audioName);
        }
    }

}

測試類:

package com.java.pattern.adapter.tobj.demo;

public class Ctest01 {

    public static void main(String[] args) {
        // 舊式的播放器只支持播放mp4格式的視頻文件
        Player mp4Player = new PlayerImpl();
        mp4Player.play("mp4", "適配器模式.mp4");
        mp4Player.play("rmvb", "適配器模式.rmvb");
        mp4Player.play("avi", "適配器模式.avi");
        System.out.println("-----------------------------------");
        // 使用[對象適配器]後,能夠兼容rmvb,avi格式的視頻文件
        AdvancedPlayer advancedPlayer = new AdvancedPlayerImpl();
        Player adapterPlayer = new PlayerAdapter(advancedPlayer);
        adapterPlayer.play("mp4", "適配器模式.mp4");
        adapterPlayer.play("rmvb", "適配器模式.rmvb");
        adapterPlayer.play("avi", "適配器模式.avi");
//        低版本播放器,目前僅支持播放mp4格式的視頻:適配器模式.mp4
//        低版本播放器,目前僅支持播放mp4格式的視頻,不支持當前格式文件:適配器模式.rmvb
//        低版本播放器,目前僅支持播放mp4格式的視頻,不支持當前格式文件:適配器模式.avi
//        -----------------------------------
//        如今開始播放mp4格式的視頻:適配器模式.mp4
//        如今開始播放rmvb格式的視頻:適配器模式.rmvb
//        如今開始播放avi格式的視頻:適配器模式.avi

        /**
         *  實現了在不改變Player接口的前提下,增長了播放rmvb,avi格式文件的功能
         */
    }

}

類適配器模式和對象適配器模式的差別:前者繼承了新版播放器的實現類,後者持有一個新播放器的實例(構造函數的參數中傳入)

3.接口適配器模式

假若有一個播放器接口(Player),這個接口中定義了播放不一樣格式視頻的方法

如今我想要新建一個播放器接口(Player)的實現類時,這個類只要專一一種格式的視頻播放就行,若是直接implements Player的話,我這個類中還要去複寫其餘格式視頻的播放方法,太過麻煩,冗餘。這時咱們就能夠用一個抽象類來implements Player,在抽象類中複寫全部方法,而後讓個人實現類來繼承這個抽象類,選擇性的複寫其中一種格式的播放方法。這個抽象類就是適配器。

播放器接口:

package com.java.pattern.adapter.tinterface.demo;

public interface Player {

    void playMp4(String audioName);

    void playRmvb(String audioName);

    void playAvi(String audioName);
}

抽象類:適配器

package com.java.pattern.adapter.tinterface.demo;

public abstract class AbstractPlayer implements Player {

    @Override
    public void playMp4(String audioName) {
        System.out.println("採用默認方式播放mp4格式文件.");

    }

    @Override
    public void playRmvb(String audioName) {
        System.out.println("採用默認方式播放rmvb格式文件.");
    }

    @Override
    public void playAvi(String audioName) {
        System.out.println("採用默認方式播放avi格式文件.");
    }

}

播放器實現類:專一MP4格式視頻播放

package com.java.pattern.adapter.tinterface.demo;

public class Mp4Player extends AbstractPlayer {

    @Override
    public void playMp4(String audioName) {
        System.out.println("採用最新的方式播放mp4格式文件.");
    }

}
相關文章
相關標籤/搜索