首页 > 其他分享 >适配器模式

适配器模式

时间:2024-09-17 15:03:51浏览次数:7  
标签:String 适配器 接口 fileName void 模式 public

适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,用于解决接口不兼容的问题。它的主要作用是将一个类的接口转换成客户端期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以一起工作。

概念

  1. 目标接口(Target): 客户端期望使用的接口。
  2. 源接口(Adaptee): 需要被适配的接口。
  3. 适配器(Adapter): 实现了目标接口,同时持有一个源接口的实例,通过适配器,将源接口的功能转换为目标接口的功能。

结构

  • Client(客户端): 使用目标接口与适配器交互。
  • Target(目标接口): 客户端期望的接口。
  • Adaptee(源接口): 需要适配的现有接口。
  • Adapter(适配器): 实现了目标接口,并在内部调用源接口的方法来完成客户端的请求。

实现

定义了一个适配器模式的实现来处理不同格式的媒体播放。使用适配器模式将两个不兼容的接口(AdvancedMediaPlayerMediaPlayer)连接起来。

对象适配器模式

使用组合(持有被适配对象)来实现适配,适合需要保持源接口和目标接口的独立性时使用。

//源接口
public interface AdvancedMediaPlayer {
    void playMp4(String fileName);
    void playVlc(String fileName);
}
//目标接口
public interface MediaPlayer {
    void play(String audioType, String fileName);
}
//适配器
public class MediaAdapter implements  MediaPlayer {
    private AdvancedMediaPlayer advancedMediaPlayer;

    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer = new Mp4Player();
        } else if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer = new VlcPlayer();
        }
    }
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp4")) {
            advancedMediaPlayer.playMp4(fileName);
        } else if (audioType.equalsIgnoreCase("vlc")) {
            advancedMediaPlayer.playVlc(fileName);
        }
    }
}
//MP4播放器
public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }

    @Override
    public void playVlc(String fileName) {
        // 不支持 VLC 格式
    }
}
//Vlc播放器
public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playMp4(String fileName) {
        // 不支持 MP4 格式
    }

    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }
}

类适配器模式

通过继承来实现适配,适合在编译时就确定源接口和目标接口之间的关系时使用。

// 目标接口
public interface MediaPlayer {
    void play(String audioType, String fileName);
}
//源接口
public interface AdvancedMediaPlayer {
    void playMp4(String fileName);
    void playVlc(String fileName);
}
// 类适配器
public class MediaAdapter extends Mp4Player implements MediaPlayer {
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp4")) {
            playMp4(fileName);
        } else if (audioType.equalsIgnoreCase("vlc")) {
            // 创建 VLC 播放器实例
            new VlcPlayer().playVlc(fileName);
        }
    }
}
//MP4播放器实现
class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }

    @Override
    public void playVlc(String fileName) {
        // 不支持 VLC 格式
    }
}
//Vlc播放器实现
class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playMp4(String fileName) {
        // 不支持 MP4 格式
    }

    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }
}

接口适配器模式

用于当接口有多个方法时,允许客户端只实现其中感兴趣的方法,避免实现所有接口方法的情况。

//目标接口
public interface MediaPlayer {
    void playMp4(String fileName);
    void playVlc(String fileName);
}
//适配器基类
public abstract class MediaAdapter implements MediaPlayer {
    @Override
    public void playMp4(String fileName) {
        // 默认实现
    }

    @Override
    public void playVlc(String fileName) {
        // 默认实现
    }
}
//MP4具体适配器
public class Mp4PlayerAdapter extends MediaAdapter {
    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}
//Vlc具体适配器
public class VlcPlayerAdapter extends MediaAdapter {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

测试(客户端)

public class TestAdapter {
    public static void main(String[] args) {
//        //类适配器模式
//        MediaPlayer mediaPlayer = new MediaAdapter();
//        mediaPlayer.play("mp4", "movie.mp4");
//        mediaPlayer.play("vlc", "documentary.vlc");

//        //对象适配器模式
//        MediaPlayer mediaPlayer = new MediaAdapter("mp4");
//        mediaPlayer.play("mp4", "movie.mp4");
//
//        mediaPlayer = new MediaAdapter("vlc");
//        mediaPlayer.play("vlc", "documentary.vlc");

        //接口适配器模式
        MediaPlayer mp4Player = new Mp4PlayerAdapter();
        mp4Player.playMp4("movie.mp4");

        MediaPlayer vlcPlayer = new VlcPlayerAdapter();
        vlcPlayer.playVlc("documentary.vlc");
    }
}

适配器模式的优点

  1. 提高代码复用性: 通过适配器,可以在不修改现有代码的情况下,使不同接口的类可以协同工作。
  2. 增强系统的灵活性和可扩展性: 适配器模式可以帮助你在系统中增加新的类而不需要修改客户端代码。
  3. 解耦合: 通过适配器,将客户端与源接口解耦,使得源接口的变化不会影响到客户端代码。

适用场景

  • 当你希望将一个现有的类的接口转换成一个客户端期望的接口时。
  • 当你希望在不修改已有代码的情况下,增加新功能或更改系统设计时。
  • 当你需要将多个类的接口适配成一个统一的接口时。

适配器模式是一种强大的设计模式,能够有效解决接口不兼容的问题,使得系统更加灵活和可扩展。

标签:String,适配器,接口,fileName,void,模式,public
From: https://www.cnblogs.com/20lxj666/p/18384964

相关文章

  • 原型模式
    原型模式原型模式(PrototypePattern)是一种创建型设计模式,其主要目的是通过复制现有的对象来创建新的对象,而不是通过构造函数进行实例化。这个模式的核心思想是“克隆”现有对象,以获得新的实例,尤其是在创建成本较高的情况下非常有用。原型模式通常涉及以下几个角色:原型(Prototyp......
  • 建造者模式
    建造者模式建造者模式(BuilderPattern)是一种创建型设计模式,它用于分步骤地创建复杂对象,而无需直接调用构造函数。通过将对象的构建过程与其表示(即对象内部细节的实现)分离,建造者模式允许创建不同的对象表示,同时保持构造过程的一致性。特点分步骤创建:建造者模式将对象的创建过程......
  • 抽象工厂模式
    抽象工厂模式抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们的具体类。抽象工厂模式常用于需要创建一组相关或依赖对象的场景,确保这些对象在不同的环境中可以协同工作。特点抽象工厂:定义了一组创......
  • 享元模式
    享元模式(FlyweightPattern)是一种结构型设计模式,旨在通过共享大量细粒度对象来减少内存使用。它在需要创建大量相似对象的场景中尤其有用,通过共享对象来降低内存开销,从而提高性能。核心思想享元模式将对象的状态分为两部分:内部状态(IntrinsicState):不随外部环境改变,可以共享的......
  • 外观模式
    外观模式外观模式(FacadePattern)是一种结构型设计模式,旨在为复杂的子系统提供一个简单的接口。它的核心思想是将系统的复杂性封装在一个统一的接口中,使得外部代码可以通过这个接口简化对复杂系统的操作。主要组成部分外观类(FacadeClass):提供一个简化的接口来访问复杂的子系统......
  • 装饰者模式
    装饰者模式装饰者模式(DecoratorPattern)是一种结构型设计模式,主要用于动态地给对象添加额外的功能,而不改变其结构。这个模式通过创建一个装饰类来包装原始对象,从而扩展其功能。主要角色组件(Component):定义一个接口或抽象类,声明可以被装饰的对象所共有的接口。具体组件(Concrete......
  • 组合模式
    组合模式组合模式(CompositePattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次关系。它允许客户端以统一的方式处理单个对象和对象集合,使得客户端不需要区分具体的对象类型,从而简化了代码的处理逻辑。主要组成部分Component(组件):定义了叶子对象和......
  • 桥接模式
    桥接模式桥接模式(BridgePattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,从而使它们可以独立地变化。这个模式的主要目的是解耦抽象和实现,使得它们可以独立地变化和扩展。主要概念抽象(Abstraction):这是一个接口或抽象类,它定义了高层次的操作。修正抽象(RefinedA......
  • 【加密算法基础——AES CBC模式代码解密实践】
    AES解密实践之代码实现AES解密使用python脚本比较灵活,但是一定要保证脚本是调试过的,才能在找到正确的密文,密钥,初始向量的情况下,解出正确的明文。但是对于AES解密,命令行无法处理key截断的问题。实际测试了一下,CBC模式,对于key截断的问题可以解决,但是CFB模式,目前还无法实验......
  • 设计模式---- 门面模式
    门面模式门面模式(FacadePattern)是一种结构型设计模式,用于为复杂子系统提供一个统一、简单的接口,隐藏系统的复杂性。通过门面模式,客户端无需直接与系统的内部组件交互,而是通过门面类与系统打交道,简化了客户端的使用,降低了系统的复杂性和耦合度。门面模式的主要概念定义:门面模......