ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

3适配器模式

2020-12-29 09:05:12  阅读:176  来源: 互联网

标签:eric void 模式 public com 适配器


适配器模式

适配器模式(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)角色:该角色定义要转换成的目标接口。
  • 源(Adaptee)角色:需要被转换成目标角色的源角色。
  • 适配器(Adapter)角色:该角色是适配器模式的核心,职责是通过继承的方式或是类关联的方式,将源角色转换为目标角色。
适配器模式类图创建目标角色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.适配器模式的使用场景

   使用适配器模式的典型场景:修改一个已经投产中的系统时,需要对系统进行扩展,此时使用一个已有的类,但这个类不符合系统接口。这时可以使用适配器模式,将不符合系统接口的类进行转换,转换成符合系统的接口或可使用的类。        
    • 美国电器110V,中国220V,就需要一个适配器将110V转化为220V。
    • Java JDK1.1 提供了Enumeration接口,而在1.2中提供了Iterator接口,想要使用1.2的JDK,则要将以前系统的Enumeration接口转化为Iterator接口,这时就需要适配器模式。
    • 在Linux上运行Windows程序。
    • Java中的jdbc

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有