headfirst设计模式第六章学习笔记--适配器模式

思想

适配器模式的原理就和转接口差不多,比如普通的耳机无法连接iPhone,但是加根转接线就好了,普通的USB线无法给type C接口的手机充电,但是加个转接口就好啦。说到底,适配器就是当某个东西不满足当前条件时,我们通过一个转换对象,使得这个东西满足条件。书上的例子更加生动形象。

 

 

将火鸡转化为鸭子(代码啦

headfirst设计模式第六章学习笔记--适配器模式_第1张图片

 

 

Duck.Java

package duck;

public interface Duck {
     public void quack();
     public void fly();
}

 

MallardDuck.Java

package duck;

public class MallardDuck implements Duck{  //duck具体实例
     @Override
    public void quack() {
        // TODO Auto-generated method stub
       System.out.println("Quack");    
    }
     
     public void fly() {
        // TODO Auto-generated method stub
       System.out.println("i'm fly");    
    }
}

 

Turkey.Java

package duck;

public interface Turkey {
      public void gobble();
      public void fly();
}

 

WildTurkey.Java

package duck;

public class WildTurkey implements Turkey{  //Turkey具体类
      @Override
    public void gobble() {
        // TODO Auto-generated method stub
      System.out.println("Gobble gobble");    
    }
      @Override
    public void fly() {
        // TODO Auto-generated method stub
       System.out.println("i'm fly shoutly");    
    }
}

 

TurkeyAdapter.Java

package adapter;

import duck.Duck;
import duck.Turkey;

public class TurkeyAdapter implements Duck{   //火鸡变鸭
    Turkey turkey;
    
    public TurkeyAdapter(Turkey turkey) {
        // TODO Auto-generated constructor stub
        this.turkey = turkey;
    }
    
    @Override
    public void quack() {
        // TODO Auto-generated method stub
        turkey.gobble();
    }
    
    @Override
    public void fly() {
        // TODO Auto-generated method stub
        turkey.fly();
    }
}

 

Test.Java

package test;

import duck.Duck;
import duck.MallardDuck;
import duck.WildTurkey;
import adapter.TurkeyAdapter;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        MallardDuck duck = new MallardDuck();
        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey);
        duck.quack();
        duck.fly();
        turkeyAdapter.quack();
        turkeyAdapter.fly();
    }

}

 

结果

headfirst设计模式第六章学习笔记--适配器模式_第2张图片

 

总结

适配器的工作量:
增加一个适配的工作量和适配对象的复杂度成正比,比如鸭子和火鸡,本身都很简单,因此适配很简单。但试想一下,如果两者都很复杂,比如Duck接口有20几个方法,那么适配器势必都要实现这20个方法,因此复杂度和接口复杂度成正比
适配器可以封装多个类么:
我觉得可以通过实现多个接口来实现。
装饰器和适配器对比:
两者都是将对象进行封装,只不过目的不同。装饰器的包装是为了给原先的对象添加一种新的功能。而适配器的目的是将一个对象包装成像另一种对象的样子,以达到符合接口要求的目的。
类适配器和对象适配器
主要区别就是实现方式类适配器通过继承实现,而对象适配器通过实现接口实现。本文中的例子就是一个对象适配器。如果将Duck由接口改成class,那么适配器就会变成类适配器。

适配器的优点

1.透明:通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的

2.重用:复用了现存的类,解决了现存类和复用环境要求不一致的问题

3.低耦合:将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。

你可能感兴趣的:(headfirst设计模式第六章学习笔记--适配器模式)