一、定义
适配器模式(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的值。源码如下:
五、总结
使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式,如果实现一个类又不想实现它的全部接口,就可以让一个抽象类,来先实现对应的接口,然后继承抽象类。
注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。