java23种设计模式-结构型模式-适配器模式

一、定义

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

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

二、优点及缺点

优点:

   1、可以让任何两个没有关联的类一起运行。

   2、提高了类的复用。

   3、增加了类的透明度。

   4、灵活性好。

缺点:

   1、过多地使用适配器,会让系统非常零乱,不易整体进行把握

三、代码实现:

首先咱从一个小故事开始吧,小两口,女生想让男生干家务,男生说你得亲亲我,我才去,这时候需要一个适配器,来完成做家务的过程。

代码如下:

类适配器模式:

女孩类:

/**
 *  @author: wsq
 *  @Date: 2020/9/24 19:53
 *  @Description:
 */
public class Girl {
    public void doSomeThing(){
        System.out.println("I kiss you!!!");
    }
}

男孩类:

/**
 *  @author: wsq
 *  @Date: 2020/9/24 20:23
 *  @Description: 男孩类
 */
public interface Boy {
    public void go();
}

适配器类:

/**
 *  @author: wsq
 *  @Date: 2020/9/24 19:53
 *  @Description: 适配器
 */
public class Adapter extends Girl implements Boy {
    @Override
    public void go() {
        super.doSomeThing();
        System.out.println("This boy starts doing the homework!!!");
    }
}

测试类:

/**
 *  @author: wsq
 *  @Date: 2020/9/24 19:57
 *  @Description: 测试类
 */
public class Test {
    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.go();
    }
}

对象适配器模式:

适配器类:

/**
 *  @author: wsq
 *  @Date: 2020/9/24 19:53
 *  @Description: 适配器可以理解为没有女孩的加油男孩不可以成功
 */
public class Adapter implements Boy {
    private Girl girl;
    public Adapter(Girl girl){
        this.girl = girl;
    }
    public Adapter(){
        this.girl = new Girl();
    }
    @Override
    public void go() {
        this.girl.doSomeThing();
        System.out.println("This boy starts doing the homework!!!");
    }
}

测试类:

/**
 *  @author: wsq
 *  @Date: 2020/9/24 19:57
 *  @Description: 测试类
 */
public class Test {
    public static void main(String[] args) {
        Adapter adapter = new Adapter();
        adapter.go();
        // 或者
        Adapter adapter1 = new Adapter(new Girl());
        adapter.go();
    }
}

这是两种思路,都可以实现这个过程

之后呢,男孩又想事情了,折磨多家务,我得啥时候才能完成,而且我是想拖地,要不我请个保姆,就这麽办,保姆就类似适配器

代码如下:

家务类:

/**
 *  @author: wsq
 *  @Date: 2020/9/24 20:06
 *  @Description: 家务活
 */
public interface HomeWork {
    public void washClothes();
    public void WashDishes();
    public void cook();
    public void MopFloor();
}

保姆类:

/**
 *  @author: wsq
 *  @Date: 2020/9/24 20:12
 *  @Description: 保姆类
 */
public abstract class Nanny implements HomeWork{
    public void washClothes(){

    }
    public void WashDishes(){

    }
    public void cook(){

    }
}

男孩类:

/**
 *  @author: wsq
 *  @Date: 2020/9/24 20:05
 *  @Description: 男孩类
 */
public class Boy extends Nanny{
    public void go(){
        System.out.println("I am a good boy!!!");
    }

    @Override
    public void MopFloor() {
        System.out.println("I finished dragging the floor!!!");
    }
}

这就是机智!!!

四、源码级别

 HashSet大家应该都挺熟悉的,它里面就用到了适配器模式,HashSet里面实际上是没有重复值的,那么它是怎么做到的呢,它引用了HashMap,只是用它的key值,用来去重。作为HashSet的值。源码如下:

五、总结

 

使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式,如果实现一个类又不想实现它的全部接口,就可以让一个抽象类,来先实现对应的接口,然后继承抽象类。

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

原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13726560.html