适配器模式

适配器模式(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 }

工作中的场景:

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

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

金麟岂是池中物,一遇风云便化龙!
原文地址:https://www.cnblogs.com/ABKing/p/12308448.html