• [java] 23种设计模式之适配器模式


    适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。首先,我们来看看类的适配器模式

    1.1 类的适配器模式

    核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口时Target,通过Adapter类,将Source的功能扩展到Target里

    1. public class Source {
    2. public void method1() {
    3. System.out.println("this is original method!");
    4. }
    5. }
    1. public class Adapter extends Source implements Target {
    2. @Override
    3. public void method2() {
    4. System.out.println("this is the targetable method!");
    5. }
    6. }

    Adapter类继承Source类,实现Target接口,下面是测试类:

    1. public class AdapterTest {
    2. public static void main(String[] args) {
    3. Target target = new Adapter();
    4. target.method1();
    5. target.method2();
    6. }
    7. }

    输出:

    this is original method!
    this is the targetable method!

    这样Target接口的实现类就具有了Source类的功能

    1.2 对象的适配器模式

    基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承Source类,而是持有Source类的实例,以达到解决兼容性的问题

    1. public class Wrapper implements Target {
    2. private Source source;
    3. public Wrapper(Source source){
    4. super();
    5. this.source = source;
    6. }
    7. @Override
    8. public void method2() {
    9. System.out.println("this is the targetable method!");
    10. }
    11. @Override
    12. public void method1() {
    13. source.method1();
    14. }
    15. }

    1. public class AdapterTest {
    2. public static void main(String[] args) {
    3. Source source = new Source();
    4. Target target = new Wrapper(source);
    5. target.method1();
    6. target.method2();
    7. }
    8. }

    1.3接口的适配器模式

    时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行

    接口:

    1. public interface Sourceable {
    2. public void method1();
    3. public void method2();
    4. }

    抽象类:

    1. public abstract class AbstracterAdapter implements SourceInterface {
    2. @Override
    3. public void method1() {
    4. }
    5. @Override
    6. public void method2() {
    7. }
    8. }

    具体类:

    1. public class SourceSub1 extends AbstracterAdapter{
    2. @Override
    3. public void method1() {
    4. System.out.println("the sourceable interface's first Sub1!");
    5. }
    6. }

    1. public class SourceSub2 extends AbstracterAdapter{
    2. @Override
    3. public void method2() {
    4. System.out.println("the sourceable interface's second Sub2!");
    5. }
    6. }
    1. public class Test {
    2. public static void main(String[] args) {
    3. SourceInterface sourceSub1 = new SourceSub1();
    4. SourceInterface sourceSub2 = new SourceSub2();
    5. sourceSub1.method1();
    6. sourceSub1.method2();
    7. sourceSub2.method1();
    8. sourceSub2.method2();
    9. }
    10. }

    测试输出:

    the sourceable interface's first Sub1!
    the sourceable interface's second Sub2!

    达到了我们的效果!

     讲了这么多,总结一下三种适配器模式的应用场景:

    类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。

    对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。

    接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

  • 相关阅读:
    ADAU1860调试心得(8)FASTDSP-0 通道输入
    【全志T113-S3_100ask】14-1 linux采集usb摄像头实现拍照(FFmpeg、fswebcam)
    ESP32设备通信-LoRaWAN网关
    3D卷积神经网络中的C代表什么,D代表什么?两者有什么区别
    排序算法--插入排序
    checking for module ‘sqlite3‘ package ‘sqlite3‘ not found
    minio 部署,并使用控制台配置
    老照片怎么修复清晰?轻松几步让图片焕发新生
    几个环境下的cuda版本
    【目标检测】one-stage------YOLO v2浅析-2016
  • 原文地址:https://blog.csdn.net/weixin_60748184/article/details/136325254