设计模式之适配器模式

前言

     曾经有一份好的工作机会放在我的面前,可惜了是家外企,人家要求英语水平比较高,而自己的英语水平...,
  要多菜有多菜。我估计这是每一个想学好英语但是又实在是学不好英语的每个人的伤痛吧。现在全球化了之后,各国
  国家往来,每个国家的公民都可以到另外一个国家去旅游,但是又不是每个人都是精通多国语言的吧。由此就产生了
  翻译这个工作。中间找个人翻译,通过翻译就可以沟通了。当然如果翻译乱翻译...,那就没办法了。在java中,这
  种场景就是适配器的场景了,翻译代表了一个适配器。

结构图

这里写图片描述

代码实例

   当一个不懂英语CBA球员到NBA打球后,如果战术部署的时候听不懂教练的英语不就坑爹了,所以在教练和CBA球员
之间安排一个翻译的人,负责将教练的的战术翻译给CBA球员听,这样就解决了CBA球员听不懂教练战术部署的问题了。
/**
 * NBA球员接口类
 */
public interface NbaPlayer {

    //进攻
    public void attack();

    //防守
    public void guard();
}

/**
 * NBA球员A类
 */
public class NbaPlayerA implements NbaPlayer {

    private String name;

    public String getName() {
        return name;
    }

    public NbaPlayerA(String name) {
        this.name = name;
    }

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

    @Override
    public void attack() {
        System.out.println("球员A" + name + "进攻");
    }

    @Override
    public void guard() {
        System.out.println("球员A" + name + "防守");
    }
}

/**
 * NBA球员B类
 */
public class NbaPlayerB implements NbaPlayer {

    private String name;

    public String getName() {
        return name;
    }

    public NbaPlayerB(String name) {
        this.name = name;
    }

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

    @Override
    public void attack() {
        System.out.println("球员B" + name + " 进攻");
    }

    @Override
    public void guard() {
        System.out.println("球员B" + name + "防守");
    }
}


/**
 * NBA球员C类
 */
public class NbaPlayerC implements NbaPlayer {

    private String name;

    public String getName() {
        return name;
    }

    public NbaPlayerC(String name) {
        this.name = name;
    }

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

    @Override
    public void attack() {
        System.out.println("球员C" + name + "进攻!");
    }

    @Override
    public void guard() {
        System.out.println("球员C" + name + "防守!");
    }
}

/**
 * CBA球员
 */
public class CbaPlayer {
    private String name;

    public CbaPlayer(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    public void cAttack(){
        System.out.println("CBA球员" + name + "进攻!");
    }

    public void cGuard(){
        System.out.println("CBA球员" + name + "防守!");
    }
}

/**
 * 适配器  翻译类
 */
public class Translation implements NbaPlayer{
    private CbaPlayer cbaPlayer;

    public Translation(String name) {
        this.cbaPlayer = new CbaPlayer(name);
    }

    @Override
    public void attack() {
        cbaPlayer.cAttack();
    }

    @Override
    public void guard() {
        cbaPlayer.cGuard();
    }
}

/**
 * 客户端测试类
 */
public class Main {

    public static void main(String[] args) {
        NbaPlayer nbaPlayerA = new NbaPlayerA("詹姆斯");
        nbaPlayerA.attack();
        nbaPlayerA.guard();
        NbaPlayer nbaPlayerB = new NbaPlayerB("加内特");
        nbaPlayerB.attack();
        nbaPlayerB.guard();
        NbaPlayer nbaPlayerC = new NbaPlayerC("科比");
        nbaPlayerC.attack();
        nbaPlayerC.guard();
        NbaPlayer translation = new Translation("姚明");
        translation.attack();
        translation.guard();
    }
}

输出结果

这里写图片描述

总结

 适配器模式:将目标类接口转化为客户端能够调用的接口,从而使得可以客户端调用目标接口。这样不必修改相关代码,
 只需要增加一个是适配器类即可。
 当一个类想调用另外一个类的一个接口或者方法的时候,发现和自己所期望的不一样,此时就可以在两者中间新增一个
 适配器类,让他来将两个接口匹配,从而可以实现调用。这样两个类之间还是没有耦合关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值