zoukankan      html  css  js  c++  java
  • 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的值。源码如下:

    五、总结

     

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

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

  • 相关阅读:
    详细分析MySQL事务日志(redo log和undo log)
    详细分析MySQL的日志(一)
    MySQL/MariaDB中的事务和事务隔离级别
    详细介绍MySQL/MariaDB的锁
    MariaDB/MySQL用户和权限管理
    (MariaDB)开窗函数用法
    翻译:window function(已提交到MariaDB官方手册)
    翻译:group_concat()函数(已提交到MariaDB官方手册)
    (MariaDB/MySQL)之DML(1):数据插入
    (MariaDB/MySQL)MyISAM存储引擎读、写操作的优先级
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13726560.html
Copyright © 2011-2022 走看看