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