适配器模式
将一个类的接口转换成客户希望的另一个类的接口。adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
涉及到的角色描述
target: 目标接口可以是类、抽象类、接口
adaptee: 需要适配的类
adapter: 适配器
应用场景
1、系统需要使用现有的类,而此类的接口不符合系统的需要。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3、通过接口转换,将一个类插入另一个类系中。
具体实现
假设姚明刚进nba并不会说英文时,沟通就会存在障碍,此时急需一名翻译官来为他翻译教练所表达的意思;在适配器设计模式中姚明就是需要适配的类adaptee,翻译官就是adapter
教练表达的内容(目标接口)
package com.chenpt.designModel.adapterModel; /** * @Author: chen * @Description: 远动员抽象类 * @Date: created in 2018/8/24 * @Modified By: */ public interface Player { void attack();//进攻 void defense();//防守 }
中锋:具体实现着
package com.chenpt.designModel.adapterModel; /** * @Author: chen * @Description: 中锋 * @Date: created in 2018/8/24 * @Modified By: */ public class Center implements Player { private String name; Center(String name){ this.name=name; } @Override public void attack() { System.out.println("中锋进攻:"+name); } @Override public void defense() { System.out.println("中锋防守:"+name); } }
后卫
package com.chenpt.designModel.adapterModel; /** * @Author: chen * @Description: 后卫 * @Date: created in 2018/8/24 * @Modified By: */ public class Guard implements Player{ private String name; Guard(String name){ this.name=name; } @Override public void attack() { System.out.println("后卫进攻:"+name); } @Override public void defense() { System.out.println("后卫防守:"+name); } }
外籍中锋(姚明创建者)
package com.chenpt.designModel.adapterModel; /** * @Author: chen * @Description: 外籍中锋 * @Date: created in 2018/8/24 * @Modified By: */ public class ForeignCenter { private String name; ForeignCenter(String name){ this.name=name; } public void 进攻() { System.out.println("外籍中锋进攻:"+name); } public void 防守() { System.out.println("外籍中锋防守:"+name); } }
适配器(翻译官)
package com.chenpt.designModel.adapterModel; /** * @Author: chen * @Description: 翻译者(适配器) * @Date: created in 2018/8/24 * @Modified By: */ public class Translator implements Player { ForeignCenter foreignCenter; Translator(ForeignCenter foreignCenter){ this.foreignCenter=foreignCenter; } @Override public void attack() { foreignCenter.进攻(); } @Override public void defense() { foreignCenter.防守(); } }
客户端
package com.chenpt.designModel.adapterModel; /** * @Author: chen * @Description: * @Date: created in 2018/8/24 * @Modified By: */ public class MainTest { public static void main(String[] args){ Center center = new Center("大鲨鱼"); center.attack(); center.defense(); Guard guard = new Guard("科比"); guard.attack(); guard.defense(); ForeignCenter center2 = new ForeignCenter("姚明"); Translator translator = new Translator(center2); translator.attack(); translator.defense(); } }
执行结果
中锋防守:大鲨鱼
后卫进攻:科比
后卫防守:科比
外籍中锋进攻:姚明
外籍中锋防守:姚明