首页 > 技术文章 > 设计模式之适配器模式

ad-zhou 2019-09-27 19:52 原文

适配器模式:用于解决两个系统之间的不兼容问题,解决两个接口之间的连接问题;

目标:将一个类的接口更改为适配另一个类的接口,并且使这些不兼容的类一起工作。

最佳解决方案:两者实现同一个接口或者继承自同一个抽象类

类图UML

 

 实例:

例如有一个抽象类Player是篮球运动员,该类姓名属性,具有两个方法Attack(),Dfend(),现在中国篮球运动员姚明,调到美国NBA,但是他听不懂教练的语言,只能配翻译,

翻译在这个地方就是适配器

 

 Player抽象类

public abstract class Player {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void Attack();

    public abstract void Dfend();
}

继承自Player的USAPlayer

public class USAPlayer extends Player {

    public USAPlayer(String name){
        super.setName(name);
    }

    @Override
    public String getName() {
        return super.getName();
    }

    @Override
    public void setName(String name) {
        super.setName(name);
    }

    @Override
    public void Attack() {
        System.out.println(super.getName()+"正在Attack....");
    }

    @Override
    public void Dfend() {
        System.out.println(super.getName()+"正在Dfend....");
    }
}

现在中国运动员的类

public class ChinaPlayer {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void ChinaAttack(){
System.out.println(this.getName()+"进攻....");
}

public void ChinaDfend(){
System.out.println(this.getName()+"防守....");
}
}

为了使教练组能够像调用Player一样ChinaPlayer类

使用翻译类

public class Translater extends Player {

    private ChinaPlayer chinaPlayer =new ChinaPlayer();

    public Translater(String name){
        chinaPlayer.setName(name);
    }

    @Override
    public String getName() {
        return chinaPlayer.getName();
    }

    @Override
    public void setName(String name) {
        chinaPlayer.setName(name);
    }

    @Override
    public void Attack() {
        chinaPlayer.ChinaAttack();
    }

    @Override
    public void Dfend() {
        chinaPlayer.ChinaDfend();
    }
}

主程序代码

public class Main {

    public static void main(String[] args) {

        Player p1=new USAPlayer("Jordan");

        Player p2=new USAPlayer("James");

        Player p3=new Translater("姚明");

        p1.Attack();
        p1.Dfend();
        p2.Attack();
        p2.Dfend();
        p3.Attack();
        p3.Dfend();
    }
}

运行效果

 

 核心目的,解决两个不兼容的类直接兼容的问题。

类似的还有比如用播放器播放MP3,MP4,AVI等格式的媒体文件,由于这些格式的文件,遵循不同的格式,所以必须有一个适配器,使其适应于不同格式文件的读取与播放

 

推荐阅读