作用:一个类的接口转换成客户希望的另外一个接口,使得原本由接口不兼容而不能一起工作的那些类可以一起工作,代码中核心的类就是适配器类
白话:
1、想象USB接口,充电不同的手机。在想使用一个已经存在的类,但是他的接口方法和你要求不相同,就需要考虑适配器模式。
2、两个类所做的事情相同或者类似,但是具有不同的接口时需要使用适配器模式、
3、客户代码可以统一调用同一个接口,就好像USB接口都不太容易修改的时候,而需要使用的设计模式。
重点:功能要类似才能使用该设计模式
1、适配器模式
1、需要适配的类
这个类是需要适应客户希望的类
class Adaptee {
public void specificRequest(){
System.out.println("特殊请求!");
}
}
2、客户期待的接口
下面的是客户期待的类,也就是想让上面的Adaptee类功能,能在Target类中使用
class Target {
public void request(){
System.out.println("普通请求!");
}
}
3、适配器类(重点)
适配器类:编写一个类继承客户接口,内部创建一个私有被适配的类,间接调用被适配类的方法
class Adapter extends Target {
private Adaptee adaptee = new Adaptee(); //建立一个私有的Adaptee对象
public void request(){ //这样就可以把表面上调用request()方法
adaptee.specificRequest(); //变成实际调用specificRequest()
}
}
4、测试和结果
public class Test {
public static void main(String[] args){
System.out.println("**********************************************");
System.out.println("《大话设计模式》代码样例");
System.out.println();
Target target = new Adapter();
target.request();
System.out.println();
System.out.println("**********************************************");
}
}
结果
2、适配器模式使用
都是中国球员沟通进攻防守,要适配一个外国人和中国沟通进行进攻和防守实现适配
1、需要适配的类
class ForeignCenter {
private String name;
public String getName(){
return this.name;
}
public void setName(String value){
this.name = value;
}
public void 进攻(){
System.out.println("外籍中锋 "+this.name+" 进攻");
}
public void 防守(){
System.out.println("外籍中锋 "+this.name+" 防守");
}
}
2、客户期待的接口
abstract class Player {
protected String name;
public Player(String name){
this.name = name;
}
public abstract void attack(); //进攻
public abstract void defense(); //防守
}
3、适配器类(重点)
class Translator extends Player {
private ForeignCenter foreignCenter = new ForeignCenter();
public Translator(String name){
super(name);
foreignCenter.setName(name);
}
public void attack(){
foreignCenter.进攻();
}
public void defense(){
foreignCenter.防守();
}
}
4、客户期待类的实现
不是重点,可以不用看
class Forwards extends Player {
public Forwards(String name){
super(name);
}
public void attack(){
System.out.println("前锋 "+this.name+" 进攻");
}
public void defense(){
System.out.println("前锋 "+this.name+" 防守");
}
}
//中锋
class Center extends Player {
public Center(String name){
super(name);
}
public void attack(){
System.out.println("中锋 "+this.name+" 进攻");
}
public void defense(){
System.out.println("中锋 "+this.name+" 防守");
}
}
//后卫
class Guards extends Player {
public Guards(String name){
super(name);
}
public void attack(){
System.out.println("后卫 "+this.name+" 进攻");
}
public void defense(){
System.out.println("后卫 "+this.name+" 防守");
}
}
5、测试和结果
public class Test {
public static void main(String[] args){
System.out.println("**********************************************");
System.out.println("《大话设计模式》代码样例");
System.out.println();
Player forwards = new Forwards("巴蒂尔");
forwards.attack();
Player guards = new Guards("麦克格雷迪");
guards.attack();
Player center = new Translator("姚明");
center.attack();
center.defense();
System.out.println();
System.out.println("**********************************************");
}
}
结果