适配器模式--我是万能胶(创建型模式05)

什么是适配器模式?
使原本因接口不匹配而无法融合的两个类或对象可以融合。
适配器,我们在日常开发中很常见,基本上看到Adapter字符都是使用了适配器模式,他就像第三方的转接,A和B认识,B和C认识,A想认识C的话,常规思维是不是通过B来介绍?这里B就充当了适配器的角色。

适配器模式适用场景
输入无法预知,输出要求一致;
系统要使用一个不认识的类,通过适配器来转接他认识的类。(接口不兼容)


接下来我们介绍两种适配器模式:

  1. 类适配器模式
  2. 对象适配器模式

适配器中的角色
Target:目标角色,即接口;
Adapter:适配器角色;
Adaptee:被改变者。
举个例子,通常笔记本电脑的电源适配是12V,我们不能把220V电源直接插到电脑上用吧,有一个长方体的变压器把220V电源变成12V来使用。这里220V电源相当于Adaptee(被改变者),变压器相当于Adapter(适配器角色),而改变后的5V电源是Target(目标角色)。


1.类适配器模式

UML类图:
适配器模式--我是万能胶(创建型模式05)_第1张图片

Target角色:

public interface IVolt12{//目标电源12V
        public void getVolt12();
}

Adaptee角色:

public class Volt220{//被改造者220V电源
    public void getVolt220(){
        System.out.println("获得220V电源");
    }
}

Adapter角色:

public class VoltAdapter extends Volt220 implements IVolt12{
    public void getVolt12(){
        System.out.println("获得12V电源");
    }
}

电源转换调用:

public class Test{
    public void main(String[] args){
        VoltAdapter adapter = new VoltAdapter();
        adapter.getVolt220();//获得220V电源
        adapter.getVolt12();//获得12V电源
    }
}

调用结果:

获得220V电源
获得12V电源

2.对象适配器模式

UML类图:
适配器模式--我是万能胶(创建型模式05)_第2张图片

Target角色:

public interface Volt12{//目标电源12V
    public void getVolt12();
}

Adaptee角色:

public class Volt220{//被改造者220V电源
    public void getVolt220(){
        System.out.println("我是220V电源");
    }
}

对象适配器模式:

public class VoltAdapter implements IVolt12{
    Volt220 mV220 = new Volt220();
    //注意接入220V电源,否则无法转换哦
    public VoltAdapter(Volt220 v){
        mV220 = v;
    }
    public void getVolt220(){
        mV220.getVolt220();
    }
    public void getVolt12(){
        System.out.println("获得12V电源");
    }
}

电源转换调用:

public class Test{
    public void main(String[] args){
        VoltAdapter adapter = new VoltAdapter(new Volt220);
        adapter.getVolt220();//获得220V电源
        adapter.getVolt12();//获得12V电源
    }
}

总结:类适配器和对象适配器如上例子所示,区别在于,对象适配器需要将被改造者传入适配器中,比类适配器更加灵活,还有一个好处就是你不知道传入对象的操作方法,更加安全了。类适配继承了传入对象,所以全都暴露出来了,所以开发中推荐使用对象适配器模式。

优点:
高复用性:通过适配器模式让本不兼容系统的类适用性更广。
扩展性强:实现适配器时我们可以调用自己的操作,从而达到扩展功能目的。

缺点:
过多使用,会让整个项目凌乱。比如A认识B,B认识C,A想通过B去认识C,但是C带了朋友D(class C implements D),A怎么能和C打招呼而不和旁边的D打招呼?这个关系如果多了是有点乱哈。

你可能感兴趣的:(设计模式)