zoukankan      html  css  js  c++  java
  • 设计模式-适配器模式

    适配器模式

    定义:将一个类的接口转为客户需要的另一个接口。目的是使原本不兼容而不能一起工作的那些类可以一起工作。

    适配器模式从实现方式上分为两种,类适配器和对象适配器。这两种的区别在与实现方式的不同,一种采用继承,一种采用组合。

    另外从使用目的也为分了两种,特殊适配器和缺省适配器。一种是为了复用原有的代码并适配当前的接口,一种是为了提供缺省的实现,避免子类实现不该实现的方法。

    1、类适配器

    如:我想给hashMap实现一个接口,但是我没法给他加啊。于是我可以新写一个类来继承HashMap,然后实现接口。
    

    2、对象适配器

    如果这个类已经有了继承关系,就需要将类用组合的方式适配
    

    使用场景:想修改一个现有在运行的系统的接口来适应新的接口需求的时候。

    注意事项:适配器模式不是在系统设计时使用的,而是为了解决正在运行的系统问题。

    示例场景:目前系统里有一个VideoPlayer接口以及两个实现类Mp4Player和AviPlayer正在工作。而第三方要求我们提供一个MediaPlayer格式的接口,而我们又不能去改VideoPlayer接口的代码。那么怎么办呢?我们加了一个MediaAdapter来做中间的适配,然后写了一个实现类(MediaPlayerImpl)来实现MediaPlayer接口,这个类通过使用MediaAdapter来适配之前系统的接口。

    代码示例:

    public interface VideoPlayer {
    
        void playVideo();
    }
    
    public class Mp4Player implements VideoPlayer {
    
        @Override
        public void playVideo() {
            System.out.println("播放mp4视频");
        }
    }
    
    public class AviPlayer implements VideoPlayer {
        @Override
        public void playVideo() {
            System.out.println("播放avi视频");
        }
    }
    
    public interface MediaPlayer {
    
        void play(String mediaType);
    }
    
    public class MediaAdapter implements MediaPlayer {
    
        private VideoPlayer videoPlayer;
    
    
        public MediaAdapter(String videoType) {
            if(videoType.equalsIgnoreCase("mp4")){
                videoPlayer=new Mp4Player();
            }else if(videoType.equalsIgnoreCase("avi")){
                videoPlayer=new AviPlayer();
            }
        }
    
        @Override
        public void play(String mediaType) {
            videoPlayer.playVideo();
        }
    }
    
    public class MediaPlayerImpl implements MediaPlayer {
    
        private MediaAdapter mediaAdapter;
    
        @Override
        public void play(String mediaType) {
           mediaAdapter=new MediaAdapter(mediaType);
           mediaAdapter.play(mediaType);
        }
    }
    

    测试代码:

      public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
            MediaPlayer mediaPlayer=new MediaPlayerImpl();
            mediaPlayer.play("avi");
        }
    

    返回目录

    书山有路勤为径,学海无涯苦作舟
  • 相关阅读:
    phpdocumentor生成代码注释文档(linux)
    phpstorm扩展
    es教程
    康威定律
    k8s
    tidb调研
    netty 在线教程
    McQueenRPC源码阅读
    DIY一些基于netty的开源框架
    性能测试
  • 原文地址:https://www.cnblogs.com/javammc/p/14940107.html
Copyright © 2011-2022 走看看