动手写一个适配器模式(JAVA版)

Java (38) 2024-02-23 15:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说动手写一个适配器模式(JAVA版),希望能够帮助你!!!。

模式的定义与特点

适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
该模式的主要优点如下。

  • 客户端通过适配器可以透明地调用目标接口。
  • 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
  • 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
  • 在很多业务场景中符合开闭原则。

其缺点是:

  • 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
  • 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。

模式的应用场景

  • 以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。
  • 使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。

模式的结构与实现

类适配器模式可采用多重继承方式实现,如 C++ 可定义一个适配器类来同时继承当前系统的业务接口和现有组件库中已经存在的组件接口;Java 不支持多继承,但可以定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。
对象适配器模式可釆用将现有组件库中已经实现的组件引入适配器类中,该类同时实现当前系统的业务接口。现在来介绍它们的基本结构。

1. 模式的结构

  1. 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
  2. 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
  3. 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

示例1类适配器

/**
* @descript 这是一个原始的接口
* This is a primitive interface
* @author 79197
*/
public interface TargetObject {
public void originalExtendedFunction() ;
}
/**
* @descript 这是被扩展类
* 作用是:在接口不满足客户需求的时候,扩展客户需求
* This is a function extended by the customer,When the interface does not meet the customer's requirements,
* the customer's requirements are extended
* @author 79197
*/
public class Adatpee {
public void extensionMethod() {
System.out.println("这是被客户扩展的类!!!(This is a function extended by the customer!)");
}
}
/**
* @descript 这是一个类适配器
* this is a class adapter
* @author 79197
*/
public class AdapterObject extends Adatpee implements TargetObject{
@Override
public void originalExtendedFunction() {
System.out.println("这是原始类,它不能满足客户需求!需要做如下扩展:::");
System.out.println("this is original class,it does not meet customer needs!The following extensions are required:::");
System.out.println("==================================================");
super.extensionMethod();
}
}
public class AdapterModeTest {
public static void main(String[] args) {
//类适配器
TargetObject obj=new AdapterObject();
obj.originalExtendedFunction();
}
}

示例2对象适配器

/**
* @descript 这是一个原始的接口
* This is a primitive interface
* @author 79197
*/
public interface TargetObject {
public void originalExtendedFunction() ;
}
/**
* Descript 被适配抽象方法 Adapted abstract method
* @author 79197
*/
abstract class AdatpeeObjec {
public void extensionMethod() {}
}
/**
* Descript 扩展类
* @author 79197
*/
public class AdatpeeObjectA extends AdatpeeObjec{
public void extensionMethod() {
System.out.println("由AdatpeeObjectA类扩展的内容(Content extended by AdatpeeObjectA)");
}
}
/**
* Descript 扩展类
* @author 79197
*/
public class AdatpeeObjectB extends AdatpeeObjec{
public void extensionMethod() {
System.out.println("由AdatpeeObjectB类扩展的内容(Content extended by AdatpeeObjectB)");
}
}
public class AdapterForObject implements TargetObject{
AdatpeeObjec adatpeeObjec;
public AdapterForObject(AdatpeeObjec id_adatpeeObjec) {
this.adatpeeObjec=id_adatpeeObjec;
}
public void originalExtendedFunction() {
System.out.println("这是原始类,它不能满足客户需求!需要做如下扩展:::");
System.out.println("this is original class,it does not meet customer needs!The following extensions are required:::");
System.out.println("==================================================");
adatpeeObjec.extensionMethod();
}
}
public class AdapterModeTest {
public static void main(String[] args) {
//类适配器
/**
TargetObject obj=new AdapterObject();
obj.originalExtendedFunction();
*/
//对象适配器
AdatpeeObjectA aObj=new AdatpeeObjectA();
AdatpeeObjectB bObj=new AdatpeeObjectB();
TargetObject obj01=new AdapterForObject(aObj);
TargetObject obj02=new AdapterForObject(bObj);
obj01.originalExtendedFunction();
obj02.originalExtendedFunction();
}
}

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复