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

3适配器模式

作者:互联网

适配器模式

适配器模式(adapter Pattern),又叫变压器模式。变压器是可以使高低电压相互转换。

1适配器模式的定义

适配的英文原文是:Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.意思是:将一个类的接口编程客户端期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式就是将一个接口或类转换成其他的接口或类,适配器相当于一个包装器。适配器设计以下三个角色:适配器模式类图创建目标角色Target.java
package com.eric.结构型模式.适配器模式.引例;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 目标角色
 * @CreateTime 2020-11-30 12:51:20
 */
public interface Target {
    //任务
    public void task();
}
创建源角色Adaptee.java
package com.eric.结构型模式.适配器模式.引例;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 源角色
 * @CreateTime 2020-11-30 12:52:09
 */
public class Adaptee {
    //原有业务处理
    public void SpecificTask(){
        System.out.println("原始业务处理中...");
    }
}
创建适配器Adapter.java
package com.eric.结构型模式.适配器模式.引例;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 适配器角色
 * @CreateTime 2020-11-30 12:53:19
 */
public class Adapter extends Adaptee implements Target {
    @Override
    public void task() {
        super.SpecificTask();
    }
}
测试类Client.java
package com.eric.结构型模式.适配器模式.引例;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 测试类
 * @CreateTime 2020-11-30 12:54:24
 */
public class Client {
    public static void main(String[] args) {
        //适配器模式应用
        Target target = new Adapter();
        target.task();
    }
}
测试结果说明适配器已经起到了作用。

2适配器模式的应用场景

    a.适配器模式的优点

    b.适配器模式的使用场景

   使用适配器模式的典型场景:修改一个已经投产中的系统时,需要对系统进行扩展,此时使用一个已有的类,但这个类不符合系统接口。这时可以使用适配器模式,将不符合系统接口的类进行转换,转换成符合系统的接口或可使用的类。        

3.适配器模式的案例

例1:水饺转换成馄饨

创建混沌接口Hundun.java
package com.eric.结构型模式.适配器模式.例1;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 馄饨接口
 * @CreateTime 2020-11-30 16:17:31
 */
public interface Hundun {
    public void makeHundun();
}
创建饺子类Dumplings.java
package com.eric.结构型模式.适配器模式.例1;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 饺子类
 * @CreateTime 2020-11-30 16:14:40
 */
public class Dumplings {
    public void makeDumplings(){
        System.out.println("调制菜馅");
        System.out.println("擀面皮");
        System.out.println("包饺子");
    }
}
创建测试类ClientDemo.java
package com.eric.结构型模式.适配器模式.例1;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 测试类
 * @CreateTime 2020-11-30 17:18:28
 */
public class ClientDemo {
    public static void main(String[] args) {
        Hundun adapter = new FoodAdapter();
        adapter.makeHundun();
    }
}
测试结果测试结果
例2媒体的播放MP3、MP4、clv、avi媒体播放器的类图创建AdvanceMediaPlayer和MediaPlayer的接口AdvanceMediaPlayer.java
package com.eric.结构型模式.适配器模式.例2.video;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 牛皮的媒体播放器  播放视频
 * @CreateTime 2020-11-30 17:28:19
 */
public interface AdvanceMediaPlayer {
    public void playVlc(String fileName);
    public void playMp4(String fileName);
}
MediaPlayer.java
package com.eric.结构型模式.适配器模式.例2.player;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 媒体接口  播放音乐使用
 * @CreateTime 2020-11-30 17:27:22
 */
public interface MediaPlayer {
    public void play(String audioType,String fileName);
}
创建AdvanceMediaPlayer的实现类Mp4Player.java
package com.eric.结构型模式.适配器模式.例2.video;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description Mp4的实现类
 * @CreateTime 2020-11-30 17:31:21
 */
public class Mp4Player implements AdvanceMediaPlayer {

    @Override
    public void playVlc(String fileName) {
        //没有此业务
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("播放Mp4文件(Name:"+fileName+")中....");
    }
}
VlcPlayer.java
package com.eric.结构型模式.适配器模式.例2.video;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description Vlc的实现类
 * @CreateTime 2020-11-30 17:29:51
 */
public class VlcPlayer implements AdvanceMediaPlayer {

    @Override
    public void playVlc(String fileName) {
        System.out.println("播放vlc文件(Name:"+fileName+")中....");
    }

    @Override
    public void playMp4(String fileName) {
        //没有此业务
    }
}
创建MediaAdapter适配器,适配视频MediaAdapter.java
package com.eric.结构型模式.适配器模式.例2.player;

import com.eric.结构型模式.适配器模式.例2.video.AdvanceMediaPlayer;
import com.eric.结构型模式.适配器模式.例2.video.Mp4Player;
import com.eric.结构型模式.适配器模式.例2.video.VlcPlayer;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 媒体适配器类
 * @CreateTime 2020-11-30 17:33:35
 */
public class MediaAdapter implements MediaPlayer {
  private AdvanceMediaPlayer advanceMediaPlayer;

  public MediaAdapter(String audioType){
      if("vlc".equalsIgnoreCase(audioType)){
          advanceMediaPlayer = new VlcPlayer();
      }else if("mp4".equalsIgnoreCase(audioType)){
          advanceMediaPlayer = new Mp4Player();
      }
  }

    @Override
    public void play(String audioType, String fileName) {
        if("vlc".equalsIgnoreCase(audioType)){
           advanceMediaPlayer.playVlc(fileName);
        }else if("mp4".equalsIgnoreCase(audioType)){
          advanceMediaPlayer.playMp4(fileName);
        }
    }
}
创建AudioPlayerAudioPlayer.java
package com.eric.结构型模式.适配器模式.例2.player;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 实现MediaPlayer接口的实现类
 * @CreateTime 2020-11-30 17:39:27
 */
//可以播放不同类型的音频格式
public class AudioPlayer implements MediaPlayer {
  private MediaAdapter mediaAdapter;
    @Override
    public void play(String audioType, String fileName) {
        //播放MP3音乐文件的内置支持
        if("mp3".equalsIgnoreCase(audioType)){
            System.out.println("播放 MP3-file(Name:"+fileName+")中...");
        }
        //mediaAdapter提供了播放其他文件格式的支持
        else if ("vlc".equalsIgnoreCase(audioType)||"mp4".equalsIgnoreCase(audioType)){
             mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType,fileName);
        }else {
            System.out.println("目前不支持"+audioType+"类型文件");
        }
    }
}
至此音频和视频的适配器已经完成,之后只需要调用AudioPlayer的play()方法即可。测试AdapterPatternDemo.java
package com.eric.结构型模式.适配器模式.例2.test;

import com.eric.结构型模式.适配器模式.例2.player.AudioPlayer;

/**
 * @author Eric
 * @ProjectName my_design_23
 * @description 测试类
 * @CreateTime 2020-11-30 17:48:32
 */
public class AdapterPatternDemo  {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();

        audioPlayer.play("mp3","你妈炸了.mp3");
        audioPlayer.play("mp4","飞翔的鸡儿.mp4");
        audioPlayer.play("vlc","进击的小人儿.vlc");
        audioPlayer.play("avi","岛国的生活.avi");

    }
}
测试结果


来自为知笔记(Wiz)

标签:eric,void,模式,public,com,适配器
来源: https://www.cnblogs.com/zyl-0110/p/14204674.html