博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式学习--适配器模式

Posted on 2017-11-14 11:25  南国木棉  阅读(109)  评论(0编辑  收藏  举报

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

适配器模式结构图:

场景案例:姚明初到NBA,教练布置战术的时候,听不懂,需要翻译。

1:创建运动员的超类,每个运动员都可以去实现。

package AdapterModel;

/**
 * 球员的超类,每个球员继承此类,进行不同的实现。
 * @author 我不是张英俊
 *
 */
abstract class Player {

    protected String name;
    public Player(String name){
        this.name=name;
    }
    //进攻
    public abstract void Attack();
    //防守
    public abstract void Defence();
}

2:运动员的实现类(此处实现三个,分别是前锋,中锋,后卫)。

package AdapterModel;


/**
 * 前锋
 * @author 我不是张英俊
 *
 */
public class Forwards extends Player{

    public Forwards(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void Attack() {
        // TODO Auto-generated method stub
        System.out.println("前锋"+name+"进攻");
    }

    @Override
    public void Defence() {
        // TODO Auto-generated method stub
        System.out.println("前锋"+name+"防守");
    }
    

}
package AdapterModel;
//中锋
public class Center extends Player {

    public Center(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void Attack() {
        // TODO Auto-generated method stub
        System.out.println("中锋"+name+"进攻");
    }

    @Override
    public void Defence() {
        // TODO Auto-generated method stub
        System.out.println("中锋"+name+"防守");
    }

}
package AdapterModel;


public class Guards extends Player {

    public Guards(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void Attack() {
        // TODO Auto-generated method stub
        System.out.println("后卫"+name+"进攻");
    }

    @Override
    public void Defence() {
        // TODO Auto-generated method stub
        System.out.println("后卫"+name+"防守");
    }

}

3:姚明是中国人,只能看懂中文,姚明的实现类。

package AdapterModel;

/**
 * 姚明,外籍在中锋,只看得懂中文
 * @author 我不是张英俊
 *
 */
public class ForeignCenter {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public void 进攻(){
        System.out.println("外籍中锋"+name+"进攻");
    }
    
    public void 防守(){
        System.out.println("外籍中锋"+name+"防守");
    }
}

4:姚明的能看懂的战术布置方案,但是教练布置的是英文的,所以,需要翻译,翻译即可以理解为适配,翻译能听懂教练布置的战术,并用汉语传给给姚明。

package AdapterModel;

/**
 * 翻译者类
 * @author 我不是张英俊
 *
 */
public class Translator extends Player {

    private ForeignCenter foreignCenter=new ForeignCenter();
    public Translator(String name) {
        super(name);
        foreignCenter.setName(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void Attack() {
        // TODO Auto-generated method stub
        foreignCenter.进攻();
    }

    @Override
    public void Defence() {
        // TODO Auto-generated method stub
        foreignCenter.防守();
    }

}

5:测试类。

package AdapterModel;

/**
 * @author 我不是张英俊
 *适配器模式:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类
 *可以一起工作。
 *场景:姚明进入NBA,但是听不懂别人说的话,需要翻译,翻译就是适配器。
 *
 */
public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Player p1=new Forwards("巴蒂尔");
        p1.Attack();
        
        Player p2=new Guards("麦迪");
        p2.Attack();
        
        Player p3=new Translator("姚明");
        p3.Attack();
        p3.Defence();
        
    }

}

 

6:控制台。

前锋巴蒂尔进攻
后卫麦迪进攻
外籍中锋姚明进攻
外籍中锋姚明防守

总结:适配器可以理解为转换成所需要的接口的东西,例如电源适配器,将电压转换,甚至变压器也可以理解为适配器,

  在软件开发中,系统的数据可行为都是正确的,但是接口不符合时,我们应该考虑适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况,在Gof的设计模式中,对适配器模式讲了两种类型,类适配器模式和对象适配器模式。

  使用一个已经存在的类,但如果他的接口,也就是她的方法和你的要求不相同时,就应该考虑适配器模式。