各位大佬们好,我是超级小白,我写的这篇文章是看B站狂神说自己学的。我写在这里记录一下,以便后期学习。如有不对的请各位大佬指教!
设计模式有23中,分为三大类,分别为:创建型模式、结构型模式、行为型模式。其中适配器模式(Adapter)属于结构模式中的一种。
通俗理解
适配器模式(Adapter)通俗点说很好理解,例如,现在新出的很多笔记本已经取消了可以直接连接网线的接口,取代的是USB接口,这样我们在连接网线上网时需要一个转接口,一边连接电脑,一边连接网线,电脑才可以成功上网,此时这个转接口就时所谓的“适配器”。又比如,我们的手机需要充电,充电时不能直接插在插线板上,需要借助手机充电器,才能充电成功,此时这个手机充电器就是所谓的“转接口”。
用个图来理解一下:
代码实现
根据手机充电器这个例子我们用代码来实现一下:
使用继承和实现
1.首先创建一个插线板(Strip)类,插线板的主要功能就是充电:
package AdapterParttern.PhoneCharageAdapter;
//这是插线板,可以给手机充电
public class Strip {
public void chargeForEverying(){
System.out.println("插线板正常工作,充电中");
}
}
2.创建手机充电器的抽象类(Charger)
package AdapterParttern.PhoneCharageAdapter;
//这是充电器的接口
public interface Charger {
//手机想要充电就需要一个充电器去和插板对接
public void beganChanger();
}
3.创建充电器接口的实现类,也就是适配器--手机充电器(ChargerAdapter)
适配器模式的特点就在这里,适配器模式主要通过继承插线板并且实现充电器,来实现的这个类
package AdapterParttern.PhoneCharageAdapter;
public class ChargerAdapter extends Strip implements Charger{
//这是充电适配器,有了它手机才能充电
@Override
public void beganChanger() {
super.chargeForEverying();
}
}
4.接下来创建手机(Phone)类
手机需要充电器才能充电,所以这里床过来一个手机充电器参数
package AdapterParttern.PhoneCharageAdapter;
//这是手机
public class Phone {
public void playGames(Charger chargerAdapter){
//手机要想满电就需要一个充电器
chargerAdapter.beganChanger();
System.out.println("手机现在满电,可以玩游戏啦!");
}
}
5.写个测试方法测试一下
package AdapterParttern.PhoneCharageAdapter;
public class Test {
public static void main(String[] args) {
System.out.println("----使用继承和实现的实现方式----");
Phone phone = new Phone();//手机
Charger chargerAdspter = new ChargerAdapter();//充电器
phone.playGames(chargerAdspter);
}
}
6.输出结果:
这是使用继承和实现的方式实现的效果,Java里面只能单继承,所以接下来介绍使用组合方式的实现方法。
使用组合和实现
第一步创建插线板Strip和第二部创建手机充电器抽象类Charger是一样的,所以直接进入第三步:
3.创建充电器接口的实现类也就是适配器(ChargerAdapter2),使用组合的方式。
package AdapterParttern.PhoneCharageAdapter;
//使用组合的方式实现
public class ChargerAdapter2 implements Charger{
private Strip strip;
public ChargerAdapter2(Strip strip){
this.strip=strip;
}
//这是充电适配器,有了它手机才能充电
@Override
public void beganChanger() {
strip.chargeForEverying();
}
}
第四步创建手机类(Phone)和上面一样。
5.写个测试方法。
package AdapterParttern.PhoneCharageAdapter;
public class Test {
public static void main(String[] args) {
Phone phone = new Phone();//手机
System.out.println("----使用组合实现的方式----");
Strip strip = new Strip();
Charger chargerAdspter2 = new ChargerAdapter2(strip);
phone.playGames(chargerAdspter2);
}
}
6.输出结果
至此,手机充电器的例子就介绍完了,现在用官方的语言来介绍一下适配器模式。
结构型模式的作用
从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题。
适配器模式
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作!
角色分析
- 目标接口(手机USB接口):客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口
- 需要适配的类(插线板接口):需要通过适配的类或适配者类
- 适配器(手机充电器):通过包装一个需要适配的对象,把原接口转换程目标对象
对象适配器的优点
(组合---既可以用家里的转接口,又能用公司的转接口)
1.一个对象适配器可以把多个不同的适配者适配到同一个目标
2.可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者的子类也可通过该适配器进行适配。
类适配器缺点
(一对一:你只能用公司的转接口,不能用自己家里的转接口)
1.对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者
2.在Java、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性。
适用场景
1.系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。
2.想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3.例如旧系统更新就可以用。