适配器、装饰者、代理模式对比

一、适配器的基本概念

1、定义:
将一个接口转换为另一个客户期望的接口。

2、应用场景:
你想使用一个已经存在的类,而它的接口不符合你的需求。 类似于一个转接口,将电源线的接口转成你电脑可用的接口。

3、类图:
这里写图片描述
* Target:期待的目标接口
* Adaptee:原来需要转换的目标
* Adapter:适配器角色。目的是将原来的目标转换成客户期望的目标

二、实例

一个mp4播放器可以播放mp4,一个mp3播放器可以播放mp3,如果想在mp3中播放mp4格式的文件。

1、Target: 期待转成MP3

public interface IMp3Player {
    /**
     * 播放MP3
     * @param fileName
     */
    void playMp3(String fileName);
}
public class MyMp3Player implements IMp3Player{
    @Override
    public void playMp3(String fileName) {
        System.out.println("正在播放mp3:"+fileName);
    }
}

2、Adaptee 原来的文件mp4

public interface IMp4Player {
    /**
     * 播放mp4
     * @param fileName
     */
    void playMp4(String fileName);

    /**
     * 获取到文件名
     * @return
     */
    String getFileName();
}
public class MyMp4Player implements IMp4Player{
    public String mFileName;

    @Override
    public void playMp4(String fileName) {
        this.mFileName = fileName;
        System.out.println("正在播放mp4:"+fileName);
    }

    @Override
    public String getFileName() {
        return mFileName;
    }
}

3、Adapter 一个格式转换器

public interface IMediaAdapter {
    /**
     * 文件转换
     */
    void conver();
}
public class MyMediaAdapter implements IMediaAdapter{
    private IMp4Player mIMp4Player;
    private IMp3Player mMp3Player;

    public MyMediaAdapter(IMp4Player mp4Player, IMp3Player mp3Player){
        this.mIMp4Player = mp4Player;
        this.mMp3Player = mp3Player;
    }

    @Override
    public void conver() {
        String fileName = mIMp4Player.getFileName();
        this.mMp3Player.playMp3(fileName.replace("mp4","mp3"));
    }
}

4、使用:

public class AdapterTest {

    public static void main(String[] args){
        //创建MP4,并播放
        IMp4Player mp4Player = new MyMp4Player();
        mp4Player.playMp4("my.mp4");
        //创建mp3
        IMp3Player mp3Player = new MyMp3Player();
        //通过适配器将mp4的文件转换,并在mp3中播放
        IMediaAdapter adapter = new MyMediaAdapter(mp4Player, mp3Player);
        adapter.conver();
    }
}

这里写图片描述

三、适配器、装饰者、代理模式对比:

1、装饰模式和代理模式的对比:

相同点:
* 代理对象和被代理对象需要继承相同的抽象类或者实现相同的接口
* 装饰对象和被装饰对象需要继承相同的抽象类或者实现相同的接口
不同点:
* 代理对象的主要作用是控制被代理对象的访问。
* 装饰对象的主要作用是增强被装饰对象的功能。

举例:

public interface IPerson {
    /**
     * 睡觉
     */
    void sleep();
}

被装饰者(被代理类):

public class Son implements IPerson {
    @Override
    public void sleep() {
        System.out.println("儿子去睡觉了");
    }
}

代理类:

public class Parent implements IPerson{
    private IPerson mPerson;
    //工作是否完成
    private boolean mFinishWork;

    public Parent(IPerson person){
        this.mPerson = person;
    }


    public void setFinishWork(boolean finishWork){
        mFinishWork = finishWork;
    }

    @Override
    public void sleep() {
        //控制了被代理类的方法调用
        if (mFinishWork) {
            mPerson.sleep();
        }
    }
}

装饰者:

public class Parent implements IPerson{
    private IPerson mPerson;

    public Parent(IPerson person){
        this.mPerson = person;
    }

    @Override
    public void sleep() {
        //多了吃饭的功能
        System.out.println("先吃饭");
        mPerson.sleep();
    }
}

2、装饰者和适配器模式对比

相同点:
* 都是对某个对象进行包装
不同点:
* 装饰者包装的是自己的同类,相同的接口或者父类
* 适配器包装的是不同类型的对象,然后将其伪装成自己的同类。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值