适配器模式--导读
现如今手机越来越离不开我们的生活,手机没电无疑是对我们的一种危险信号,特别是在我们外出的时候。我们一定碰到这样的情况,当我们问其他人充电器的时候,你可能会发现人家的是typec 的但是你是安卓的。你又用不了别人的充电器而只能干着急。所以我们需要一个适配器来解决这种端口不匹配的问题。
适配器模式--定义
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
适配器模式--结构
这个适配器模式充满着良好的面向设计原则:使用对象组合,以修改的接口包装别适配者。而且这样做还有一个优点,被适配者的任何子类,都可以搭配适配器使用。
适配器模式有如下四个角色:
Target:目标抽象类
Adapter:适配器类
Adaptee:适配者类
Client:客户类
适配器模式--代码实现
现在我们就以手机充电器为例子来实现:
AndriodCharger.java
package Adapter_Pattern; /** * 安卓充电器 * @author liu * */ public interface AndriodCharger { public void Andriodcharger(String type); }
TypeCCharger.java
package Adapter_Pattern; /** * typec的从电器 * @author liu * */ public interface TypeCCharger { public void TypecCharger(String type); }
MyCharger.java
package Adapter_Pattern; /** * 自己的typec从电器 * @author liu * */ public class MyCharger implements TypeCCharger { @Override public void TypecCharger(String type) { if(type.equals("typec")) System.out.println("使用typec充电器在充电"); else System.out.println("插口不匹配,不能充电"); } }
OthersCharger.java
package Adapter_Pattern; /** * 别人的安卓从电器 * @author liu * */ public class OthersCharger implements AndriodCharger { public void Andriodcharger(String type) { if(type.equals("安卓")) System.out.println("使用安卓的充电器充电"); else System.out.println("端口不匹配,不能充电"); } }
TypeCAdapter.java
package Adapter_Pattern; /** * typec的适配器 * @author liu * */ public class TypeCAdapter implements TypeCCharger { AndriodCharger androidCharger; public TypeCAdapter(String type) { if(type.equals("安卓")) androidCharger=new OthersCharger(); } public void TypecCharger(String type) { if(type.equals("typec")) System.out.println("使用typec充电器在充电中"); else if(type.equals("安卓")) androidCharger.Andriodcharger(type); else System.out.println("端口不匹配不能充电"); } }
client.java
package Adapter_Pattern; /** * 模拟 * @author liu * */ public class Client { public static void main(String[] args) { MyCharger myCharger=new MyCharger(); //当我没带typec充电器时,别人只有安卓充电器 myCharger.TypecCharger("安卓"); //因为串口不匹配所以我们需要使用,适配器来进行适配 TypeCAdapter adapter=new TypeCAdapter("安卓"); //这样我们就能使用安卓的充电器给typec手机端口充电了 adapter.TypecCharger("安卓"); } }
适配器模式--优缺点
优点:
①可以在不修改原有代码的基础上来复用现有类,很好地符合 “开闭原则”(这点是两种实现方式都具有的)
②采用 “对象组合”的方式,更符合松耦合。
缺点:
①使得重定义Adaptee的行为较困难,这就需要生成Adaptee的子类并且使得Adapter引用这个子类而不是引用Adaptee本身。
适配器模式--场景
1、系统需要使用现有的类,而此类的接口不符合系统的需要。
2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。
3、通过接口转换,将一个类插入另一个类系中