设计模式学习心得<适配器 Adapter>

适配器模式(Adapter Pattern)是做为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。java

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。设计模式

概述


  • 意图
    将一个类的接口转换成客户但愿的另一个接口。
    适配器模式使得本来因为接口不兼容而不能一块儿工做的那些类能够一块儿工做。this

  • 主要解决
    主要解决在软件系统中,经常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能知足的。设计

  • 什么时候使用
  1. 系统须要使用现有的类,而此类的接口不符合系统的须要。
  2. 想要创建一个能够重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在未来引进的类一块儿工做,这些源类不必定有一致的接口。
  3. 经过接口转换,将一个类插入另外一个类系中。
    (好比老虎和飞禽,如今多了一个飞虎,在不增长实体的需求下,增长一个适配器,在里面包容一个虎对象,实现飞的接口。)
  • 如何解决
    继承或依赖(推荐)。code

  • 关键代码
    适配器继承或依赖已有的对象,实现想要的目标接口。对象

  • 应用实例
  1. 美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。
  2. JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将之前系统的 Enumeration 接口转化为 Iterator 接口,这时就须要适配器模式。
  3. 在 LINUX 上运行 WINDOWS 程序。
  4. JAVA 中的 jdbc。
  • 优势
  1. 可让任何两个没有关联的类一块儿运行。
  2. 提升了类的复用。
  3. 增长了类的透明度。
  4. 灵活性好。
  • 缺点
  1. 过多地使用适配器,会让系统很是零乱,不易总体进行把握。
    好比,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统若是太多出现这种状况,无异于一场灾难。所以若是不是颇有必要,能够不使用适配器,而是直接对系统进行重构。
  2. 因为 JAVA 至多继承一个类,因此至多只能适配一个适配者类,并且目标类必须是抽象类。
  • 使用场景
    有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。blog

  • 注意事项
    适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。继承

实现


  • 适配器模式有以下三个角色
    Target:目标抽象类
    Adapter:适配器类
    Adaptee:适配者类

  • step 1
    须要一个Adaptee接口:Robot.java。提供cry()run()方法。
public interface Robot {
     void cry();

     void move();
 }
  • step 2
    实现Adaptee接口:BioRobot.java。它能够叫和慢慢跑
public class BioRobot implements Robot{

     public void cry() {
         System.out.println("仿生机器人叫.....");
     }

     public void move() {
         System.out.println("仿生机器人慢慢移动....");
     }

 }
  • step 3
    须要Target类:Dog.java。它能够汪和快跑
public class Dog {
     public void wang(){
         System.out.println("小狗叫:汪汪.....");
     }

     public void run(){
         System.out.println("小狗快快跑......");
     }
 }
  • step 4
    轮到重点啦:适配器Adapter,这个适配器可以使仿生机器人像狗同样叫,同样跑。
public class DogAdapter implements Robot{
     Dog dog;
     public DogAdapter(Dog dog){     //取得要适配的对象的引用
         this.dog = dog;
     }

     /**
      * 实现接口中的方法,只须要在相应的方法间进行转换便可完成。
      */
     public void cry() {
         System.out.println("机器人模拟狗叫...");
         dog.wang();
     }

     public void move() {
         System.out.println("机器人模拟狗跑...");
         dog.run();
     }

     public static void main(String[] args) {
         BioRobot robot = new BioRobot();        //首先咱们须要一个机器人
         Dog dog = new Dog();         //和一只狗
 
         //将这只狗包装到机器人中,使其有点儿像机器人
         Robot dogRobot = new DogAdapter(dog);

         //而后是机器人叫和跑
         System.out.println("BioRob cry.....");
         dogRobot.cry();
         dogRobot.move();
     }
 }

运行结果:接口

BioRob cry......
机器人模拟狗叫...
小狗叫:汪汪......
机器人模拟狗跑...
小狗快快跑......
相关文章
相关标签/搜索