1.6_适配器模式

适配器模式有三种:类适配器、对象适配器、接口适配器(缺省适配器)
 
  1. 类适配器:
• Target: 定义Client使用的与特定领域相关的接口。
• Client: 与符合Target接口的对象协同。
• Adaptee: 定义一个已经存在的接口,这个接口需要适配。
• Adapter: 对Adaptee的接口与Target接口进行适配
例如安卓数据线正常使用的话,就只能给安卓手机充电,但是想要给小米手机充电的话,就必须用安卓数据线适配一个Type-C口才能给小米手机充电。
package co.xiaowenzi.study.single;
// Target: 安卓数据线
public interface Android interface {
   public void powerAndroidPhone();
}
 
package co.xiaowenzi.study.single;
public class AndroidPhone implements Android interface {
   @Override
   public void powerAndroidPhone() {
      System.out.println("Android数据线正常使用,给安卓手机充电");
   }
}
 
package co.xiaowenzi.study.single;
//Adaptee: 定义一个已经存在的TypeC口,这个口需要适配。
public class TypeC {
   public void powerXiaomiPhone() {
      System.out.println("Android数据线接上TypeC口,给小米手机充电");
   }
}
 
package co.xiaowenzi.study.single;
//Adapter: 安卓数据线接上Type-C接口给小米手机充电
public class TypeCAdapter extends TypeC implements Android interface {
   @Override
   public void powerAndroidPhone() {
      super.powerXiaomiPhone();
   }
}
 
package co.xiaowenzi.study.single;
//Client
public class PhoneClient {
   public static void main(String[] args) {
      // 安卓手机充电
      Android interface concreteTarget = new AndroidPhone();
      concreteTarget.powerAndroidPhone();
 
      // 小米手机充电
      Android interface adapter = new TypeCAdapter();
      adapter.powerAndroidPhone();
   }
}
 
  1. 对象适配器:
把类适配器里面继承的方法,改为类对象,然后对象实现具体的方法
package co.xiaowenzi.study.single;
 
//Adapter: 安卓数据线接上Type-C接口给小米手机充电
public class TypeCAdapter implements Android interface {
   private TypeC mTypeC;
   
   public TypeCAdapter(TypeC typeC) {
      this.mTypeC = typeC;
   }
   
   @Override
   public void powerAndroidPhone() {
      mTypeC.powerXiaomiPhone();
   }
}
 
package co.xiaowenzi.study.single;
//Client
public class PhoneClient {
   public static void main(String[] args) {
      // 安卓手机充电
      Android interface concreteTarget = new AndroidPhone();
      concreteTarget.powerAndroidPhone();
 
      // 小米手机充电
      Android interface adapter = new TypeCAdapter(new TypeC());
      adapter.powerAndroidPhone();
   }
}
测试结果与上面的一致。修改的只就是 Adapter 类的内部结构,即 Adapter 自身必须先拥有一个被适配类的对象,再把具体的特殊功能委托给这个对象来实现。使用对象适配器模式,可以使得 Adapter 类(适配类)根据传入的 Adaptee 对象达到适配多个不同被适配类的功能,当然,此时我们可以为多个被适配类提取出一个接口或抽象类。这样看起来的话,似乎对象适配器模式更加灵活一点。
 
  1. 接口适配器
原理:通过抽象类来实现适配,这种适配稍别于上面所述的适配。
package co.xiaowenzi.study.single;
public interface Porwer interface {
    void powerAndroidPhone();
    void powerXiaomiPhone();
}
 
package co.xiaowenzi.study.single;
public class PhoneAdapter implements Porwer interface {
   @Override
   public void powerAndroidPhone() {
   }
 
   @Override
   public void powerXiaomiPhone() {
   }
}
 
package co.xiaowenzi.study.single;
public class Phone extends PhoneAdapter{
   public void powerAndroidPhone() {
      System.out.println("给安卓手机充电");
   }
 
   public void powerXiaomiPhone() {
      System.out.println("给小米手机充电");
   }
}
 
package co.xiaowenzi.study.single;
//Client
public class PhoneClient {
   public static void main(String[] args) {
      Phone phone = new Phone();
      phone.powerAndroidPhone();
      phone.powerXiaomiPhone();
   }
}
当存在这样一个接口,其中定义了许多的方法,而现在却只想使用其中的一个到几个方法,如果直接实现接口,那么要对所有的方法进行实现,哪怕仅仅是对不需要的方法进行置空(只写一对大括号,不做具体方法实现)也会导致这个类变得臃肿,调用也不方便,这时可以使用一个抽象类作为中间件,即适配器,用这个抽象类实现接口,而在抽象类中所有的方法都进行置空,那么在创建抽象类的继承类,而且重写需要使用的那几个方法即可。
适配器模式优点 
1.更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
2.更好的扩展性:在实现适配器功能的时候,可以扩展自己源的行为(增加方法),从而自然地扩展系统的功能。
适配器模式缺点 
会导致系统紊乱:滥用适配器,会让系统变得非常零乱。
例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,导致代码运行混乱且难查出原因。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章