写点什么

设计模式的艺术 第十五章代理设计模式练习(设计一款基于 C/S 的网络图片查看器,用户只需在图片查看器中输入网页 URL,程序将自动将网页所有图片下载到本地。)

作者:代廉洁
  • 2022 年 9 月 01 日
    浙江
  • 本文字数:2105 字

    阅读完需:约 7 分钟

Sunny 软件公司欲开发一款基于 C/S 的网络图片查看器,具体功能描述如下:用户只需在图片查看器中输入网页 URL,程序将自动将网页所有图片下载到本地。考虑到有些网页图片比较多,而且某些图片文件比较大,因此将先以图标的方式显示图片。不同类型的图片使用不同的图标,并且在图标下面标注该图片的文件名,用户单击图片后可查看原图。试使用虚拟代理模式设计并实现该图片查看器。(可以结合多线程机制,使用一个线程显示小图标,同时启动另一个线程在后台加载原图。)


一、类结构图



抽象主题角色类:设计为名称为 WebImageViewer 的接口,包含抽象方法 downloadImages(String webPageUrl);

真实主题角色类:设计为抽象主题角色类的子类,设计为名称为 RealWebImageViewer 的具体类,包含具体方法 downloadImages(String webPageUrl);

代理主题角色类:设计抽象主题角色类的子类,名称为 ProxyWebImageViewer 的具体类,持有一个真实主题角色类 RealWebImageViewer 的引用,并实现抽象主题角色类的抽象方法 downloadImages(String webPageUrl),方法内部启用 2 个线程,一个线程用于展示图片类型的图片、一个线程通过调用真实主题角色类对象的方法用于下载真实的图片。

图片类型查看器具体类:设计为名称为 ImageTypeViewer 的具体类,包含获取所有图片地址的具体方法 getImageUrls()、获取所有图片对应类型的具体方法 getProxyImages()。


二、典型实现代码


抽象网页图片查看器类:抽象主题角色类
public interface WebImageViewer {    void downloadImages(String webPageUrl);}
复制代码


真实网页图片查看器类:真实主题角色类
public class RealWebImageViewer implements WebImageViewer {    @Override    public void downloadImages(String webPageUrl) {        System.out.println("开始下载网页里的全部真实图片");    }}
复制代码


代理网页图片查看器类:代理主题角色类
public class ProxyWebImageViewer implements WebImageViewer{    private RealWebImageViewer realWebImageViewer;    private ImageTypeViewer imageTypeViewer;
@Override public void downloadImages(String webPageUrl) { imageTypeViewer = new ImageTypeViewer(webPageUrl); realWebImageViewer =new RealWebImageViewer();
new Thread(new Runnable() { @Override public void run() { imageTypeViewer.getImageUrls(); imageTypeViewer.getProxyImages(); } }).start();
new Thread(new Runnable() { @Override public void run() { realWebImageViewer.downloadImages(webPageUrl); } }).start(); }}
复制代码


图片类型查看器具体类:具体类
public class ImageTypeViewer {    private String webPageUrl;    private Map<String, String> nameUrlPair;    private Map<String, String> nameTypePair;
public String getWebPageUrl() { return webPageUrl; }
public void setWebPageUrl(String webPageUrl) { this.webPageUrl = webPageUrl; }
public Map<String, String> getNameUrlPair() { return nameUrlPair; }
public void setNameUrlPair(Map<String, String> nameUrlPair) { this.nameUrlPair = nameUrlPair; }
public Map<String, String> getNameTypePair() { return nameTypePair; }
public void setNameTypePair(Map<String, String> nameTypePair) { this.nameTypePair = nameTypePair; }
public ImageTypeViewer(String webPageUrl) { this.webPageUrl = webPageUrl; }
public void getImageUrls() { System.out.println("获取网页中的所有图片名称和对应图片地址"); Map<String, String> nameUrlPair = new HashMap<String, String>(); nameUrlPair.put("xiaolonglv.png", "http://imagesource.com/static/xiaolonglv.png"); this.nameUrlPair = nameUrlPair; }
public void getProxyImages() { System.out.println("获取图片名称对应的图片类型"); Map<String, String> nameTypePair = new HashMap<String, String>(); nameUrlPair.forEach((key, value) -> { String imageType = key.substring(key.lastIndexOf(".")); nameTypePair.put(key, imageType); }); }}
复制代码


客户端代码:
public class Client {    public static void main(String[] args) {        WebImageViewer proxyWebImageViewer;        String webPageUrl = "http://imagesource.com/static/1";        proxyWebImageViewer = new ProxyWebImageViewer();        proxyWebImageViewer.downloadImages(webPageUrl);    }}
复制代码


编译并运行程序,输出如下结果:
获取网页中的所有图片名称和对应图片地址获取图片名称对应的图片类型开始下载网页里的全部真实图片
复制代码


发布于: 刚刚阅读数: 6
用户头像

代廉洁

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
设计模式的艺术 第十五章代理设计模式练习(设计一款基于C/S的网络图片查看器,用户只需在图片查看器中输入网页URL,程序将自动将网页所有图片下载到本地。)_设计模式的艺术_代廉洁_InfoQ写作社区