适配器模式(Adapter)----设计模式
文章目录
What is it(它是什么)?
适配器模式(Adapter Pattern)是作为两个不兼容之间接口之间的桥梁。
适配器模式来源于生活,例如,读卡器是作为内存卡和笔记本之间的适配器,电流转换插座是解决所需电压和实际电压不匹配的适配器等等。
适配器模式的简单介绍
简单来说,适配器模式主要解决的是两个不兼容接口连接的问题。
适配器模式的工作原理
简单来说,就是将不兼容的类通过适配器转化为可以兼容的类进行协同工作。
适配器模式实现的三种方式
- 类适配器: 通过继承的方式使适配器类继承被适配类,从而可以使用并改变被适配类的运行操作,实现工作兼容。
- 对象适配器: 通过将被适配类聚合到适配器类中,根据构造方法传入被适配类实例,适配器类根据此实例进行操作,从而实现接口兼容,推荐使用。
- 接口适配器: 通过定义一个抽象类继承接口,覆写接口中的所有方法,这样,继承此抽象类的子类就可以有选择的使用接口中的方法。
嘻嘻,是不是有些难以理解,没关系,下面我来演示一下相信大家就能够清楚。
适配器小案例
现在小高有一个手机(Phone),但是很不巧没有电了需要充电,但是插座却是220V的电压,手机所需充电电压为5V,此时需要设计一个将220V电压转化为5V电压的转化插座,你能帮小高设计好么?
以类适配器进行设计
此适配器通过继承的方式对被适配类进行操作改进,从而实现了电压的兼容。
插座220V类
package com.design_patterns.adapter.classadapter;
public class Voltage220V {
//输出220伏电压
public int output220V(){
int src = 220;
System.out.println("电压 = " + src + "伏");
return src;
}
}
输出电压为5V的接口
package com.design_patterns.adapter.classadapter;
public interface IVoltage5V {
public int output5V();
}
进行电压转换的类适配器
package com.design_patterns.adapter.classadapter;
//适配器类
public class VoltageAdapter extends Voltage220V implements IVoltage5V{
//覆写接口中的方法
@Override
public int output5V() {
//获取到220V的电压
int srcV = output220V();
int dstV = srcV / 44; //转成5V
return dstV;
}
}
手机类
package com.design_patterns.adapter.classadapter;
public class Phone {
//充电
public void charging(IVoltage5V iVoltage5V){
if(iVoltage5V.output5V() == 5){
System.out.println("电压为5V,可以充电~~~");
} else if (iVoltage5V.output5V() > 5){
System.out.println("电压大于5V,不可以充电~~~");
}
}
}
客户端使用并充电
package com.design_patterns.adapter.classadapter;
public class Client {
public static void main(String[] args) {
System.out.println("====类适配器模式====");
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
运行结果
====类适配器模式====
电压 = 220伏
电压为5V,可以充电~~~
以对象适配器进行设计
此适配器通过聚合的方式对被适配类进行操作改进,从而实现了电压的兼容,下面仅列出与上面适配器的不同之处。
进行电压转换的对象适配器
package com.design_patterns.adapter.objectadapter;
//适配器类
public class VoltageAdapter implements IVoltage5V {
private Voltage220V voltage220V; //关联关系-聚合
//通过构造方法得到Voltage220V的对象实例
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
/**
* 将220V的电压转换为5V的电压的方法
* 返回转换过后的电压
* @return
*/
@Override
public int output5V() {
//获取到220V的电压
int srcV = this.voltage220V.output220V();
int dstV = srcV / 44;
System.out.println("使用对象适配器适配完成!!!");
return dstV;
}
}
客户端使用并充电
package com.design_patterns.adapter.objectadapter;
public class Client {
public static void main(String[] args) {
System.out.println("====对象适配器模式====");
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
运行结果
====对象适配器模式====
电压 = 220伏
使用对象适配器适配完成!!!
电压为5V,可以充电~~~
接口适配器、缺省适配器模式(自定义小案例)
定义的接口
package com.design_patterns.adapter.interfaceadapter;
public interface Interface4 {
public void m1();
public void m2();
public void m3();
public void m4();
}
定义的抽象类
package com.design_patterns.adapter.interfaceadapter;
public abstract class AbsAdapter implements Interface4 {
@Override
public void m1() {
}
@Override
public void m2() {
}
@Override
public void m3() {
}
@Override
public void m4() {
}
}
定义的测试类进行测试
package com.design_patterns.adapter.interfaceadapter;
public class Client {
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
/**
* 此时只需要去覆盖我们需要使用的接口方法
*/
@Override
public void m1() {
System.out.println("调用的是子类m1的方法");
}
};
absAdapter.m1();
}
}
运行结果
调用的是子类m1的方法
嘻嘻,这个案例虽然特别简单,但是在实际开发中还是非常有用的,通过设计一个抽象类适配器用来只实现需要实现的方法。
总结
至此,适配器的基本内容就梳理完了,嘻嘻,可能这次梳理的不是特别生动和有趣,小伙伴们理解就好,谢谢~