說明:在不改變舊接口代碼的前提下,爲該接口新增其餘接口的功能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格式文件."); } }