1.适配器模式测试
package com.zhaoshuangjian.mode07_适配器模式; import com.zhaoshuangjian.mode07_适配器模式.mode07.CAdapter类.QQPlayer; import com.zhaoshuangjian.mode07_适配器模式.mode07.IAdapter接口.APlayer; import com.zhaoshuangjian.mode07_适配器模式.mode07.IAdapter接口.AbstractPlayer; import com.zhaoshuangjian.mode07_适配器模式.mode07.IAdapter接口.BPlayer; import com.zhaoshuangjian.mode07_适配器模式.mode07.IAdapter接口.CPlayer; import com.zhaoshuangjian.mode07_适配器模式.mode07.Mp3; import com.zhaoshuangjian.mode07_适配器模式.mode07.OAdapter对象.BaoFengPlayer; import com.zhaoshuangjian.mode07_适配器模式.mode07.Player; /** * <p>适配器模式测试 </p> * * @Author zhaoshuangjian 2023-03-25 上午10:39 */ public class AdapterTest { public static void main(String[] args){ // 使用类适配器 useAdapterOfClass(); // 使用对象适配器 useAdapterOfObject(); // 使用接口适配器 useAdapterOfInterFace(); /** * 类适配器:当一个类A想拥有某个接口I里的所有功能时,却又懒得实现接口中的M方法时 * 则可以专门定义一个类B,B中的方法和接口I中的M方法保持一致,只不过B中的M方法已经通过定制进行了功能实现 * 这时候,我们称B是一个待适配的类,而B中的M方法我们称原方法,接口I中的M方法称作目标方法 * A类我们则称呼为真正要适配的类,这个类通过继承B类、实现接口I即可具有目标接口I中的所有功能 * 正如一开始说的,适配的类A,懒得实现接口I中的M方法,怎么办,那我们就专门给A开个小灶,交给B类来做就好了 * * 对象适配器:其实和类适配器差不多,唯一的区别就是,类适配器无法对B类进行实例化,不够灵活,而对象适配器中 * 则将B类的实例放在了真正适配的类中,不管是内部还是外部,都可以实例化B对象,实现不同B对象的原始方法 * * 接口适配器:类适配和对象适配器有个不好的地方就是,适配器对象必须实现接口I中的所有功能 * 但现实是,我有时候不太想要I中的某些功能,怎么办? * 比如A对象只实现I中的M方法,B对象只实现I中的N方法,而C对象则全部实现I中的M、N、P方法 * 这时候就需要借助抽象类Ab了,Ab实现接口I,抽象类和接口的区别就是,抽象类中的方法无需都实现, * 而接口中的方法必须全部实现,这样一来,我们适配的类就可以通过只继承Ab类来实现接口I中的部分功能了 * * 项目中,具体用到哪种模式的适配器,可以好好斟酌一下了 * */ } private static void useAdapterOfClass() { // 类适配器模式测试 == 持有类Mp3的原始方法,但是不能创建该类的实例 Player qqPlayer = new QQPlayer(); qqPlayer.playMusics(); qqPlayer.playMVs(); qqPlayer.playMovies(); System.out.println("============分割线"); } private static void useAdapterOfObject() { // 对象适配器模式测试 == 持有类Mp3的原始方法,但是可以创建不同的Mp3类的实例 Mp3 sonyMp3 = new Mp3("索尼(SONY) NW-ZX300A"); Player bfPlayer = new BaoFengPlayer(sonyMp3); bfPlayer.playMusics(); bfPlayer.playMVs(); bfPlayer.playMovies(); System.out.println("=========暴风影音升级"); // 暴风音影升级,改用纽曼的Mp3播放音乐功能 Mp3 newsMyMp3 = new Mp3("纽曼(Newsmy)F35"); ((BaoFengPlayer)bfPlayer).setMp3(newsMyMp3); bfPlayer.playMusics(); bfPlayer.playMVs(); bfPlayer.playMovies(); System.out.println("============分割线"); } private static void useAdapterOfInterFace() { // 接口适配模式测试 == 适配类无需实现接口里面的所有方法,这时候需要借助一个抽象类进行一下过度 AbstractPlayer aPlayer = new APlayer(); aPlayer.show(); AbstractPlayer bPlayer = new BPlayer(); bPlayer.show(); AbstractPlayer cPlayer = new CPlayer(); cPlayer.show(); } }
2.MP3播放器 == 功能单一,只播放歌曲
package com.zhaoshuangjian.mode07_适配器模式.mode07; /** * <p>MP3播放器 == 功能单一,只播放歌曲</p> * * @Author zhaoshuangjian 2023-03-25 上午10:39 */ public class Mp3 { private String name = ""; public Mp3(){ } public Mp3(String name) { this.name = name; } /** * 播放歌曲 == 凡是能播放音乐的设备,都要适配Mp3类的这个方法 * 如果你说鼠标能播放歌曲,Ok,也不是做不到,哈哈 */ public void playMusics() { System.out.println("Mp3 -- "+this.name+"播放歌曲"); } public String getName() { return name; } public void setName(String name) { this.name = name; } }
3.播放器接口
package com.zhaoshuangjian.mode07_适配器模式.mode07; /** * <p>播放器接口 </p> * * @Author zhaoshuangjian 2023-03-25 上午10:39 */ public interface Player { /** * 播放MV */ public void playMVs(); /** * 播放音乐 == 与Mp3播放音乐的功能【方法】名称一致 */ public void playMusics(); /** * 播放电影 */ public void playMovies(); }
4.适配器 == QQ播放器,将Mp3播放音乐的功能直接扩展到播放器里,即无需再实现播放器播放音乐的功能了
package com.zhaoshuangjian.mode07_适配器模式.mode07.CAdapter类; import com.zhaoshuangjian.mode07_适配器模式.mode07.Mp3; import com.zhaoshuangjian.mode07_适配器模式.mode07.Player; /** * <p>适配器 == QQ播放器,将Mp3播放音乐的功能直接扩展到播放器里,即无需再实现播放器播放音乐的功能了</p> * * @Author zhaoshuangjian 2023-03-25 上午10:39 */ public class QQPlayer extends Mp3 implements Player{ @Override public void playMVs() { System.out.println("QQ播放器实现播放MV功能"); } @Override public void playMovies() { System.out.println("QQ播放器实现播放电影功能"); } }
5.播放器抽象类 == 实现播放接口
package com.zhaoshuangjian.mode07_适配器模式.mode07.IAdapter接口; import com.zhaoshuangjian.mode07_适配器模式.mode07.Player; /** * <p>播放器抽象类 == 实现播放接口</p> * <p>抽象类中的方法:无需全部实现</p> * <p>接口中的方法 :必须全部实现</p> * * @Author zhaoshuangjian 2023-03-25 上午10:39 */ public abstract class AbstractPlayer implements Player{ /** * 播放MV == */ @Override public void playMVs(){} /** * 播放音乐 */ @Override public void playMusics(){} /** * 播放电影 */ @Override public void playMovies(){} /** * 播放器功能展示抽象方法,子类中必须实现 */ public abstract void show(); }
6.播放器A == 只具有播放歌曲的功能
package com.zhaoshuangjian.mode07_适配器模式.mode07.IAdapter接口; /** * <p>播放器A == 只具有播放歌曲的功能</p> * * @Author zhaoshuangjian 2023-03-25 上午10:39 */ public class APlayer extends AbstractPlayer{ /** * 重写父类方法 */ @Override public void playMusics() { System.out.println("A实现播放音乐的功能"); } @Override public void show(){ System.out.println("=====播放器A功能展示:"); playMusics(); playMVs(); playMovies(); } }
7.播放器B == 只具有播放MV的功能
package com.zhaoshuangjian.mode07_适配器模式.mode07.IAdapter接口; /** * <p>播放器B == 只具有播放MV的功能</p> * * @Author zhaoshuangjian 2023-03-25 上午10:39 */ public class BPlayer extends AbstractPlayer{ /** * 重写父类方法 */ @Override public void playMVs() { System.out.println("B实现播放MV的功能"); } @Override public void show(){ System.out.println("=====播放器B功能展示:"); playMusics(); playMVs(); playMovies(); } }
8.播放器C == 即能播放音乐、MV、又能播放电影
package com.zhaoshuangjian.mode07_适配器模式.mode07.IAdapter接口; /** * <p>播放器C == 即能播放音乐、MV、又能播放电影</p> * * @Author zhaoshuangjian 2023-03-25 上午10:39 */ public class CPlayer extends AbstractPlayer{ /** * 重写父类播放MV方法 */ @Override public void playMVs() { System.out.println("C实现播放MV的功能"); } @Override public void playMusics() { System.out.println("C实现播放音乐的功能"); } @Override public void playMovies() { System.out.println("C实现播放电影的功能"); } @Override public void show(){ System.out.println("=====播放器C功能展示:"); playMusics(); playMVs(); playMovies(); } }
9.适配器 == 暴风音影播放器,将Mp3播放音乐的功能直接扩展到播放器里,即无需再实现播放器播放音乐的功能了
package com.zhaoshuangjian.mode07_适配器模式.mode07.OAdapter对象; import com.zhaoshuangjian.mode07_适配器模式.mode07.Mp3; import com.zhaoshuangjian.mode07_适配器模式.mode07.Player; /** * <p>适配器 == 暴风音影播放器,将Mp3播放音乐的功能直接扩展到播放器里,即无需再实现播放器播放音乐的功能了</p> * * @Author zhaoshuangjian 2023-03-25 上午10:39 */ public class BaoFengPlayer implements Player{ /** * 唯一不同于QQ适配器的地方就是,暴风适配器里面可以创建Mp3的实例 * 即可以实现不同原对象播放音乐的方法,无需再继承Mp3类 */ private Mp3 mp3; public BaoFengPlayer(Mp3 mp3) { this.mp3 = mp3; } @Override public void playMVs() { System.out.println("暴风影音实现播放MV功能"); } @Override public void playMusics() { this.mp3.playMusics(); } @Override public void playMovies() { System.out.println("暴风影音实现播放电影功能"); } /** * @return the mp3 */ public Mp3 getMp3() { return mp3; } /** * @param mp3 the mp3 to set */ public void setMp3(Mp3 mp3) { this.mp3 = mp3; } }