设计模式之适配器模式

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

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

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

类图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等格式的媒体文件,由于这些格式的文件,遵循不同的格式,所以必须有一个适配器,使其适应于不同格式文件的读取与播放

 

转载于:https://www.cnblogs.com/ad-zhou/p/11600000.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值