设计模式文章汇合:http://aphysia.cn/categories/…
开局一张图,剩下全靠写 …
介绍
适配器模式(百度百科):在计算机编程中,适配器模式(有时候也称包装款式或者包装)将一个类的接口适配成用户所期待的。一个适配容许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类本人的接口包裹在一个已存在的类中。
适配器模式的次要目标就是为了 兼容性, 把原来不匹配的两个类或者接口能够协同工作,它属于结构型模式,次要分为三种:类适配器,对象适配器,接口适配器。
适配器模式灵活性比拟好,能够进步复用性,然而如果滥用,零碎调用关系会比较复杂,每一次的适配,实质上都是一种斗争。
一直斗争,最初迎来的,必然是重构。
适配器模式类型
类适配器
形容:适配器的类(Adapter
), 通过继承原有类,同时实现目标接口,实现的性能是领有原有类的属性办法,同时能够调用指标接口。
例子: 原来一种充电器 (指标类) 能够给 IPhone
充电, 另一种充电器 (接口) 能够给 Android
手机充电,咱们想实现一种适配器能够让 IPhone
充电器领有 Android
充电器的性能。
代码构造如下:
AndroidCharger.class
:
// 给 android 充电的接口
public interface AndroidCharger {public void androidout();
}
-
AppleCharger.class
// 给苹果充电的类 public class AppleCharger {public void iphoenOut(){System.out.println("我是充电器,我能够给苹果充电..."); } }
-
ChagerAdapater.class
// 充电适配器 public class ChagerAdapater extends AppleCharger implements AndroidCharger { @Override public void androidout() {iphoenOut(); System.out.println("适配器开始工作 ----"); System.out.print("我领有了给 Android 充电的能力"); } }
-
Test.class
public class Test {public static void main(String[]args){ChagerAdapater chagerAdapater = new ChagerAdapater(); chagerAdapater.androidout();} }
运行后果如下:
集体了解:这里之所以一个继承一个接口,是因为 java 只能单继承,要去适配多个类,只能一个继承,一个用接口实现, 有肯定局限性。重写它的办法,这也比拟灵便,能够对接口办法进行批改。
2. 对象适配器
集体了解:下面所说的类适配器是通过继承与实现接口的形式实现(所继承的父类以及接口都是一个 class
),对象适配器就是依据“合成复用准则”, 不应用继承关系 ,而是应用了 关联关系 ,间接把另一个类的对象当成 成员对象 ,也就是持有之前须要继承的类的实例。
代码构造没有扭转,只是从新创立了一个包:
-
更改后的
ChagerAdapater.class
// 充电适配器 public class ChagerAdapater implements AndroidCharger { // 持有苹果充电器的实例 private AppleCharger appleCharger; // 结构器 public ChagerAdapater(AppleCharger appleCharger){this.appleCharger = appleCharger;} @Override public void androidout() {System.out.println("适配器开始工作 ----"); System.out.print("我领有了给 Android 充电的能力"); } }
-
更改后的 Test.class
public class Test {public static void main(String[]args){ChagerAdapater chagerAdapater = new ChagerAdapater(new AppleCharger()); chagerAdapater.androidout();} }
运行后果没有扭转:
- 集体了解:这个和第一品种的适配器其实思维上差不多,只是实现的形式不一样,类适配器是通过继承类,实现接口,对象适配器是把要继承的类变成了 属性对象 ,把实例与适配器关联起来,也就是适配器的类持有了原有父类的对象实例。一般而言,因为
java
是单继承,所以咱们尽量不要把这一次应用继承的机会给节约了,这样写也比拟灵便。
3. 接口适配器
接口适配器,也能够称为默认适配器模式,或者缺省适配器模式。当咱们不须要全副实现接口所实现的办法的时候,咱们能够设计一个抽象类去实现接口,而后再这个抽象类中为所有办法提供一个默认的实现,这个抽象类的子类就能够有选择地对办法进行实现了。
代码构造如下:
解释:学生类
能够吃饭,学习,然而 老师类
也吃饭,然而老师不是学习,而是教书,所以咱们把 学习
, 吃饭
, 教书
当成接口的办法,因为不是所有的类都须要实现所有接口,咱们在两头实现了一个抽象类实现这些接口,所有的办法都提供了一个默认是实现办法。而后学生类或者老师类才去继承抽象类,从而实现本人所须要的一部分办法即可。
myInterface.class
// 定义接口的办法
public interface myInterface {
// 学习的接口办法
public void study();
// 教书的接口办法
public void teach();
// 吃饭的接口办法
public void eat();}
-
myAbstractClass.class(抽象类)
public abstract class myAbstractClass implements myInterface{ // 学习的接口办法 @Override public void study(){} @Override // 吃饭的接口办法 public void eat(){} // 教书的接口办法 @Override public void teach(){} }
-
Student.class(学生类)
public class Student extends myAbstractClass{ // 学习的接口办法 @Override public void study(){System.out.println("我是学生,我要好好学习"); } @Override // 吃饭的接口办法 public void eat(){System.out.println("我是学生,我要吃饭"); } }
-
Teacher.class(老师类)
public class Teacher extends myAbstractClass { @Override // 吃饭的接口办法 public void eat(){System.out.println("我是老师,我要吃饭"); } // 教书的接口办法 @Override public void teach(){System.out.println("我是老师,我要教育祖国的花朵"); } }
-
Test.calss(测试类)
public class Test {public static void main(String[] args){Student student = new Student(); Teacher teacher = new Teacher(); student.eat(); student.study(); teacher.eat(); teacher.teach();} }
运行的后果:
4. 总结
1. 类适配器模式次要是通过继承指标的类,实现要减少的接口办法,就能够把类与接口适配一起工作。
2. 对象的适配器与类适配器性能大抵一样,然而为了更加灵便,不再应用继承的形式,而是间接应用了成员变量这样的办法,将指标的类的对象持有,再实现要减少的接口办法,达到一样的目标。
3. 接口适配器模式,是把所有的办法定义到一个接口外面,而后创立一个抽象类去实现所有的办法,再应用真正的类去继承抽象类,只须要重写须要的办法,就能够实现适配的性能。
如果有趣味,能够理解一下另外一种说法的适配器模式[https://blog.csdn.net/Aphysia…]
4. 倡议尽量应用对象的适配器模式,少用继承。适配器模式也是一种包装模式,它与装璜模式同样具备包装的性能,此外,对象适配器模式还具备委托的意思。总的来说,适配器模式属于弥补模式,专门用来在零碎前期扩大、批改时应用,但要留神不要适度应用适配器模式。
【作者简介】:
秦怀,公众号【秦怀杂货店 】作者,技术之路不在一时,山高水长,纵使迟缓,驰而不息。集体写作方向:Java 源码解析
,JDBC
,Mybatis
,Spring
,redis
, 分布式
, 剑指 Offer
,LeetCode
等,认真写好每一篇文章,不喜爱题目党,不喜爱花里胡哨,大多写系列文章,不能保障我写的都完全正确,然而我保障所写的均通过实际或者查找材料。脱漏或者谬误之处,还望斧正。
剑指 Offer 全副题解 PDF
2020 年我写了什么?
开源编程笔记
关注公众号”秦怀杂货店“能够支付
剑指 Offer V1
版本的C++
解法,敬请期待。