首页 > 代码库 > 适配器模式

适配器模式

1.     现实生活中有很多原来的东西和目标的东西不匹配,但是你还要去用,那么这时候怎么办呢,就需要一个东西,是原来的东西能够被目标东西所使用,这就是适配器,也是体现它的价值的地方,例如两头插座和三孔插座,两头插头需要这个三孔插座变成两空插头从而能够使用,这时候来个转化器既可以使用了,这个转化器就是适配器,它能够实现三孔插座变成两孔从而能够使用。

2.     所以适配器涉及三个角色:

目标角色

源角色

适配器角色

3.     适配器让目标使用源的方法,所以需要实现目标接口,重构接口方法,调用源接口的方法(由于调用的方式不一样,分为:类适配(继承),对象适配(依赖组合))

4.     代码实现

源接口

package adaptmodel;
public interface SourceInter {
    public void ThreeHoles();
}

 

源实现类

package adaptmodel;
 
public class ThreeHoles implements SourceInter {
 
    @Override
    public void ThreeHoles() {
       // TODO Auto-generated method stub
           System.out.println("使用三孔充电");
    }
}

 

目标接口

package adaptmodel;
 
public interface TargetInter {
    public void TwoHead();
}

 

目标实现类

package adaptmodel;
 
public class Twoheads implements TargetInter {
    @Override
    public void TwoHead() {
       // TODO Auto-generated method stub
        System.out.println("用两头充电");
    }
}

 

类适配器

package adaptmodel;
/**
 * 这里使用类适配器通过继承实现,但是这里没有对象适配器灵活
 * @author Administrator
 *
 */
public class Adapt2 extends ThreeHoles implements TargetInter {
    @Override
    public void TwoHead() {
       // TODO Auto-generated method stub
       super.ThreeHoles();
    }
}

 

对象适配器

package adaptmodel;
 
/**
 * 适配器能够提供目标客户想要的接口,所以需要重构目标接口的方法,
 * 从而来调用源接口的方法(这里是对象适配器,优点:可以提供所接口以及子接口的重构的方法)
 * @author Administrator
 *
 */
public class Adapt implements TargetInter {
    
    private SourceInter sourceInter;
    Adapt(SourceInter sourceInter){
        this.sourceInter = sourceInter;
    }
    @Override
    public void TwoHead() {
       // TODO Auto-generated method stub
       sourceInter.ThreeHoles();
    }
}

 

测试

package adaptmodel;
 
public class TestAdapt {
    public static void main(String[] args) {
       // TODO Auto-generated method stub
       /*
        * 这里其实目标和源不是直接打交道的,是adpat实现了源的功能,然后目标通过adapt使用源的功能
        */
       //使用has a的形式,对象适配器
       TargetInter targetinter=new Adapt(new ThreeHoles());
       targetinter.TwoHead();
       //is a的形式 类适配器
       TargetInter targetInter2=new Adapt2();
       targetInter2.TwoHead();
    }
}

 

5.     可以看出适配器适合的场景

就是接口不一致,但是又想使用,

1) 现有系统和源系统接口不一致

2) 使用接口不一致的api

6.     适配器的缺点:

重新构建新的适配器比较麻烦

7.     实例:

.net dataAdap

适配器模式