主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。解决兼容性问题。
关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。
使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
接口:MusicPlayer :
public interface MusicPlayer { /** * @Author hsir * @Date 13:36 2019-7-16 * @Param [type, filename]音乐格式,文件 * @return void **/ public void play(String type,String filename); }
PlayerAdapter:
public class PlayerAdapter implements MusicPlayer { //在适配器里面使用旧接口 private ExistPlayer player; public PlayerAdapter(){ player = new ExistPlayer(); } @Override public void play(String type, String filename) { if (type == "mp3"){ player.playMp3(filename); }else if (type == "wma"){ player.playWma(filename); } } }
已存在ExistPlayer类:
public class ExistPlayer { public void playMp3(String fileName){ System.out.println("play mp3 : " + fileName); } public void playWma(String fileName){ System.out.println("play wma : " + fileName); } }
测试类:DoSome
public class DoSome { public static void main(String[] args) { MusicPlayer player = new PlayerAdapter(); player.play("mp3","a.mp3"); player.play("wma","b.wma"); } }
输出:
play mp3 : a.mp3 play wma : b.wma
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
来源:https://www.cnblogs.com/recurision/p/11200580.html