适配器模式(adapter)

定义

  将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

UML类图

例子

  在NBA的赛场上,姚明还不会说英文,教练也不会说中文,所以需要一个翻译,对应的,翻译就起到了适配器的作用。

  篮球运动员类

package com.csdhsm.pattemdesign.adapter;

/**  
 * @Title:  Player.java   
 * @Description: 球员抽象类
 * @author: Han   
 * @date:   2016年6月25日 下午6:56:33  
 */  
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 defense();
}

  

package com.csdhsm.pattemdesign.adapter;

/**  
 * @Title:  Fowards.java   
 * @Description: 后卫类,可以听懂教练的话
 * @author: Han   
 * @date:   2016年6月25日 下午6:57:59  
 */  
public class Fowards extends Player {

    @Override
    public void attack() {
        
        System.out.println("后卫" + super.getName() + "快去进攻!");
    }

    @Override
    public void defense() {

        System.out.println("后卫" + super.getName() + "快去防守!");
    }
}

  外籍中锋

package com.csdhsm.pattemdesign.adapter;

/**  
 * @Title:  ForeignCenter.java   
 * @Description: 外籍中锋,听不懂attack和defense,只能听懂jingong和fangshou
 * @author: Han   
 * @date:   2016年6月25日 下午7:02:31  
 */  
public class ForeignCenter {
    
    private String name;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    //外籍中锋能听懂的进攻
    public void jingong() {
        
        System.out.println("中锋" + this.getName() + "快去进攻!");
    }

    //外籍中锋能听懂的防守
    public void fangshou() {

        System.out.println("中锋" + this.getName() + "快去防守!");
    }
}

  翻译

package com.csdhsm.pattemdesign.adapter;

/**  
 * @Title:  Translator.java   
 * @Description: 翻译类,起到适配器作用
 * @author: Han   
 * @date:   2016年6月25日 下午7:21:05  
 */  
public class Translator extends Player {

    private ForeignCenter ymm = new ForeignCenter();
    
    @Override
    public void setName(String name) {
        super.setName(name);
        ymm.setName(this.getName());
    }
    
    @Override
    public void attack() {
        ymm.jingong();
    }

    @Override
    public void defense() {
        ymm.fangshou();
    }
}

  客户端

package com.csdhsm.pattemdesign.adapter;

public class Solution {
    
    public static void main(String[] args) {
        Player m = new Fowards();
        m.setName("麦迪");
        Player y = new Translator();
        y.setName("姚明");
        
        m.attack();
        m.defense();
        y.attack();
        y.defense();
    }
}

  结果

  OK。成功。

总结

  适配器模式的用意是要改变源的接口,以便于目标接口相容。缺省适配的用意稍有不同,它是为了方便建立一个不平庸的适配器类而提供的一种平庸实现。

  在任何时候,如果不准备实现一个接口的所有方法时,就可以使用“缺省适配模式”制造一个抽象类,给出所有方法的平庸的具体实现。这样,从这个抽象类再继承下去的子类就不必实现所有的方法了。

 posted on 2016-06-25 20:02  韩思明  阅读(169)  评论(0编辑  收藏  举报