`

2. 结构型模式 (1) 适配器模式

阅读更多
2. 结构型模式 (1) 适配器模式

将一个类的接口转换成客户希望的另外一个接口。

Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

模式中的角色:
1. 需要适配的类(Adaptee):需要适配的类或适配者类。
2. 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
3. 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

优点:
1. 可以让任何两个没有关联的类一起运行。
2. 提高了类的复用。
3. 增加了类的透明度。
4. 灵活性好。

缺点:
1. 过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
2. 由于JAVA至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。


1. 适配器模式

package com.andrew.pattern0201.adapter.model01;
public interface MediaPlayer {
    public void play(String audioType, String fileName);
}

package com.andrew.pattern0201.adapter.model01;
public interface AdvancedMediaPlayer { 
    public void playVlc(String fileName);
    public void playMp4(String fileName);
}


package com.andrew.pattern0201.adapter.model01;
public class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: "+ fileName);
    }
    @Override
    public void playMp4(String fileName) {
        
    }
}

package com.andrew.pattern0201.adapter.model01;
public class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        
    }
    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: "+ fileName);
    }
}

package com.andrew.pattern0201.adapter.model01;
public class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMusicPlayer;
    public MediaAdapter(String audioType) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer = new Mp4Player();
        }
    }
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("vlc")) {
            advancedMusicPlayer.playVlc(fileName);
        } else if (audioType.equalsIgnoreCase("mp4")) {
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}


package com.andrew.pattern0201.adapter.model01;
public class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;
    @Override
    public void play(String audioType, String fileName) {
        if (audioType.equalsIgnoreCase("mp3")) {
            System.out.println("Playing mp3 file. Name: "+ fileName);
        } else if (audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")) {
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        } else {
            System.out.println("Invalid media. " + audioType + " format not supported");
        }
    }
}


package com.andrew.pattern0201.adapter.model01;
/**
 * 1. 适配器模式
 * 
 * @author andrew
 * @date 2018/07/18
 */
public class AdapterClient {
    public static void main(String[] args) {
        AudioPlayer audioPlayer = new AudioPlayer();
        audioPlayer.play("mp3", "beyond the horizon.mp3");
        audioPlayer.play("mp4", "alone.mp4");
        audioPlayer.play("vlc", "far far away.vlc");
        audioPlayer.play("avi", "mind me.avi");
    }
}
// 运行结果:
Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported
分享到:
评论

相关推荐

    java 23种设计模式.zip

    2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略...

    [结构型模式] 适配器模式的理解

    适配器模式是一种结构型设计模式,它允许不兼容的接口之间进行通信,通过创建一个适配器对象作为中间桥梁,使得原本不匹配的接口能够协同工作。在软件开发中,适配器模式的应用十分广泛,尤其是在处理遗留系统或者...

    JAVA-设计模式-结构型模式-适配器模式

    JAVA-设计模式-结构型模式-适配器模式

    结构型模式之适配器模式

    适配器模式是一种在软件设计中广泛使用的结构型设计模式,它的主要目的是解决不同系统、类库或组件之间的接口不兼容问题,使原本无法协同工作的模块能够顺利地一起工作。适配器模式的核心思想是“转换”,通过创建一...

    C#面向对象设计模式纵横谈\7 结构型模式Adapter 适配器模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第7节:结构型模式Adapter 适配器模式

    Python 程序语言设计模式思路-结构型模式:适配器模式-将不兼容的接口转换为可兼容的接口

    适配器模式(Adapter Pattern)是一种结构型设计模式,旨在将一个类的接口转换为客户端期望的另一个接口,从而使原本由于接口不兼容而无法一起工作的类能够协同工作。适配器模式通过引入一个适配器类,解决了接口不...

    c++设计模式-结构型模式-适配器模式

    c++设计模式-结构型模式-适配器模式,其他工程,c++源码。适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

    [结构型模式] head first 设计模式之适配器模式(Adapter)

    1. 类适配器模式:适配器类是适配者类的子类,通过继承的方式实现接口的转换。这种方式适用于适配者类是可继承的,且客户端期待的接口与适配者类的接口不完全冲突的情况。 2. 对象适配器模式:适配器类包含一个适配...

    软件设计模式实验2结构型模式源码

    适配器模式:电子商务网站有购物车的功能,可以把挑选的东西加入购物车,可以把挑选的东西加入购物车、删除或者更改购买数量,并对多个商品进行一次性结算。为了实现订单功能,系统基于MVC模式.... 3.装饰者模式:这...

    java设计模式之适配器模式

    适配器模式是一种在软件工程中广泛使用的结构型设计模式,它允许两个不兼容的接口之间进行通信。在Java中,适配器模式扮演着重要的角色,尤其在处理遗留代码或者第三方库集成时,能够有效地解决接口不匹配的问题。...

    .Net设计模式_适配器模式

    适配器模式是一种在软件工程中广泛使用的结构型设计模式,它的主要目的是为了让不兼容的接口之间能够进行通信。在.NET开发中,适配器模式扮演着重要角色,尤其是在处理不同系统、库或组件间的集成时。这个".Net设计...

    设计模式:结构型-适配器模式

    适配器模式是一种结构型设计模式,用于解决两个不兼容接口之间的问题,它充当了两者之间的桥梁。适配器模式可以分为三种类型:类适配器模式、对象适配器模式和接口适配器模式。 类适配器模式中,适配器类通过继承...

    Java 23种设计模式10适配器模式.pdf

    适配器模式是结构型模式的一种,其核心思想是将一个类的接口转换为客户期望的另一个接口。在软件开发中,经常会遇到现有类的接口不符合需求的情况,尽管该类的功能满足了客户类的需求。此时,适配器模式便扮演起...

    【IT十八掌徐培成】Java基础第06天-05.匿名内部类-适配器模式.zip

    Java编程语言以其强大的功能和广泛的应用领域,在IT行业中占据着重要的地位。在学习Java的过程中,掌握各种设计模式是提升编程技能...匿名内部类-适配器模式.avi"视频,你可以更直观地了解和学习这两种技术的具体应用。

    设计模式实验报告-适配器模式.docx

    适配器模式(Adapter Pattern)是一种结构型设计模式,其主要目的是将一个类的接口变换成客户端所期待的另一种接口。通过这种方式,原本由于接口不兼容而无法一起工作的类可以顺利合作。适配器模式有两种实现方式:...

    设计模式_结构型_适配器模式.md

    适配器模式是软件设计中的一种常用模式,属于结构型模式。其核心目的是解决两个已有接口之间不兼容的问题,使它们能够协同工作。适配器模式可以看作是软件开发中的“桥梁”或“转换器”,在不修改原有接口的基础上,...

    1.抽象类与适配器模式

    适配器模式是一种结构型设计模式,它的主要作用是将两个不兼容的接口或类进行桥接,使原本无法协作的类能够协同工作。在现实生活中,电源适配器就是一个很好的例子,它将不同电压或插头规格转换为设备可以接受的格式...

    Java设计模式之适配器模式

    适配器模式是一种结构型设计模式,它允许两个不兼容的接口能够协同工作。本文将深入探讨适配器模式的原理、分类以及在Java中的实现方式。 #### 适配器模式的基本原理 适配器模式的核心在于创建一个新的类(适配器...

Global site tag (gtag.js) - Google Analytics