zoukankan      html  css  js  c++  java
  • 适配器模式

    适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

    在适配器模式中,我们通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。

    根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。

    我们假设一个场景:我们有一台笔记本电脑,还有一台投影仪,但是这台投影仪不能直接插上笔记本电脑(因为没有这样的接口),那么我们就需要一个转接头。在这个例子中,转接头就是适配器,作用就是将一个接口转换成另一个接口。

    写一个笔记本电脑 Laptop类

     1 package top.bigking.adapter;
     2 
     3 /**
     4  * @Author ABKing
     5  * @Date 2020/2/14 下午2:32
     6  * 笔记本电脑
     7  **/
     8 public class Laptop {
     9     public void shadow(Target target){
    10         target.handler();
    11     }
    12 }

    写一个投影仪 Projector类

     1 package top.bigking.adapter;
     2 
     3 /**
     4  * @Author ABKing
     5  * @Date 2020/2/14 下午2:29
     6  * 投影仪
     7  **/
     8 public class Projector {
     9     //投影
    10     public void shadow(){
    11         System.out.println("投影屏幕上的内容");
    12     }
    13 }

    可以看到,如果Laptop类的shadow()方法需要传入一个Target接口

    我们写Target接口

    package top.bigking.adapter;
    
    /**
     * @Author ABKing
     * @Date 2020/2/14 下午2:34
     **/
    public interface Target {
        public void handler();
    }

    那么我们就需要一个适配器Adapter类,这个类实现了这个Target接口,并且继承了Projector这个类

     1 package top.bigking.adapter;
     2 
     3 /**
     4  * @Author ABKing
     5  * @Date 2020/2/14 下午2:37
     6  **/
     7 public class Adapter1 extends Projector implements Target {
     8     @Override
     9     public void handler() {
    10         super.shadow();
    11     }
    12 }

    可是这样就会带来一个问题,Adapter和Projector并没有逻辑意义上的继承关系,而且java里只有单继承,所以我们一般采用第二种方式:把Projector作为类的属性

     1 package top.bigking.adapter;
     2 
     3 /**
     4  * @Author ABKing
     5  * @Date 2020/2/14 下午2:42
     6  **/
     7 public class Adapter2 implements Target {
     8     private Projector projector;
     9     @Override
    10     public void handler() {
    11         projector.shadow();
    12     }
    13 
    14     public Adapter2(Projector projector) {
    15         this.projector = projector;
    16     }
    17 }

    JUnit测试

     1 package top.bigking.adapter;
     2 
     3 import org.junit.Test;
     4 
     5 /**
     6  * @Author ABKing
     7  * @Date 2020/2/14 下午2:38
     8  **/
     9 public class TestAdapter {
    10     @Test
    11     public void testAdapter1(){
    12         Laptop laptop = new Laptop();
    13         Projector projector = new Projector();
    14         Target target = new Adapter1();
    15         laptop.shadow(target);
    16     }
    17     @Test
    18     public void testAdapter2(){
    19         Laptop laptop = new Laptop();
    20         Projector projector = new Projector();
    21         Target target = new Adapter2(projector);
    22         laptop.shadow(target);
    23     }
    24 }

    工作中的场景:

    经常用来做旧系统的改造和升级

    如果我们的系统开发之后再也不需要维护,那么很多模式都是没必要的。但不幸的是,事实却是维护一个系统的代价往往是开发一个系统的数倍。

    金麟岂是池中物,一遇风云便化龙!
  • 相关阅读:
    Java:多线程<一>
    Java:Exception
    Java: 内部类
    Ubuntu安装jdk
    ubuntu搜狗拼音安装
    录音-树莓派USB摄像头话筒
    leetcode 最小栈
    leetcode 编辑距离 动态规划
    leetcode 最小覆盖字串
    leetcode 最长上升子序列 动态规划
  • 原文地址:https://www.cnblogs.com/ABKing/p/12308448.html
Copyright © 2011-2022 走看看