ICode9

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

设计模式之 外观模式

2020-12-09 16:32:06  阅读:127  来源: 互联网

标签:文件 外观 封面 String 模式 接口 new 设计模式 public


外观模式:隐藏系统的复杂性,向客户端提供一个可以访问的接口。

外观模式提供一个类,用于简化现有系统对特定功能的复杂调用;通过让客户端调用这个类,来隐藏系统的复杂性,防止低水平人员带来不必要的风险。

外观模式在实际系统中使用也是较为频繁的,比如说:

我们在开发一个提取视频封面的功能,早期是这样设计的:

  1. 首先调用上传文件的接口,然后得到视频存储在服务器上的地址;

  2. 然后调用生成视频封面的接口,传入上一步获取的文件地址,得到生成封面的路径;

  3. 最后调用下载文件的接口,传入上一步生成封面的路径;

这样就可以得到视频的封面了。

然后使用这个功能的人就发现,生成视频封面图片真麻烦。每次来一个新的员工都要给他说明要调用那些接口以及调用接口的顺序。

于是我们就提供了一个类,这个类做的事情就是:提供一个接口,这个接口只需要接收视频文件,然后就能返回该视频的封面图片。

我们在这个类里面去组合生成封面的接口,然后把得到的结果返回出去即可;这样在调用人员来说就只有一个接口,他们也不需要知道提取到封面的流程是什么了,大大降低了调用接口的复杂性。

现在我们来看一下外观模式的类图

image-20201209120102736

现在我们用外观模式实现一下提取视频封面代码

第一步:创建保存文件业务类

/**
 * 保存文件业务类
 *
 * @author lixin
 */
public class SaveFileService {
    /**
     * 保存文件
     *
     * @param filename 文件名
     * @return 文件在服务器删的地址
     */
    public String save(String filename) {
        System.out.println(filename + " 文件保存成功!");
        return "/www/file/" + filename;
    }
}

第二步:创建生成封面业务类

/**
 * 生成封面业务类
 *
 * @author lixin
 */
public class CreateCoverService {
    /**
     * 提取指定视频文件的封面
     *
     * @param path 视频文件的路径
     * @return 返回封面图片的路径
     */
    public String cover(String path) {
        System.out.println("视频【" + path + "】封面提取成功!");
        return "/www/file/cover.jpg";
    }
}

第三步:创建下载文件处理类

/**
 * 下载文件处理类
 *
 * @author lixin
 */
public class DownFileService {
    /**
     * 下载指定文件
     *
     * @param path 文件的路径
     */
    public void down(String path) {
        System.out.println("文件【" + path + "】已保存到【D:\\down】目录下");
    }
}

第四步:创建封面处理外观类

/**
 * 封面外观类,处理视频封面的类
 *
 * @author lixin
 */
public class CoverFacade {
    SaveFileService saveFileService = new SaveFileService();
    CreateCoverService coverService = new CreateCoverService();
    DownFileService downFile = new DownFileService();
    /**
     * 生成视频的封面地址
     *
     * @param filename 文件名
     */
    public void cover(String filename) {
        // 1.保存文件
        String filePath = saveFileService.save(filename);
        // 2.生成封面
        String coverPath = coverService.cover(filePath);
        // 3.下载封面
        downFile.down(coverPath);
    }
}

第五步:创建客户端测试程序

/**
 * 客户端测试程序
 *
 * @author lixin
 */
public class ClientDemo {

    public static void main(String[] args) {
        ClientDemo client = new ClientDemo();
        //client.oldApi();
        client.newApi();
    }
    
    /**
     * 旧的接口
     */
    public void oldApi() {
        // 1.保存文件
        SaveFileService saveFileService = new SaveFileService();
        String filePath = saveFileService.save("东京不太热.avi");
        // 2.生成封面
        CreateCoverService coverService = new CreateCoverService();
        String coverPath = coverService.cover(filePath);
        // 3.下载封面
        DownFileService downFile = new DownFileService();
        downFile.down(coverPath);
    }

    /**
     * 新的接口
     */
    public void newApi() {
        CoverFacade facade = new CoverFacade();
        facade.cover("东京不太热.avi");
    }
    
}

输出结果:

东京不太热.avi 文件保存成功!
视频【/www/file/东京不太热.avi】封面提取成功!
文件【/www/file/cover.jpg】已保存到【D:\down】目录下

标签:文件,外观,封面,String,模式,接口,new,设计模式,public
来源: https://www.cnblogs.com/lixingwu/p/14109401.html

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

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

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

ICode9版权所有