前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >结构型模式:代理模式

结构型模式:代理模式

作者头像
LieBrother
发布2019-05-17 16:30:39
3330
发布2019-05-17 16:30:39
举报
文章被收录于专栏:LieBrotherLieBrother

七大结构型模式之七:代理模式

简介

姓名 :代理模式 英文名 :Proxy Pattern 价值观 :为生活加点料 个人介绍 : Provide a surrogate or placeholder for another object to control access to it. 为其他对象提供一种代理以控制对这个对象的访问。 (来自《设计模式之禅》)

你要的故事

咱们从事 IT 行业,随时都可能上网查东西,如果网络速度慢或者网络访问受限制,那是相当的折磨,忍无可忍。而咱在国内网络比较特殊,有个墙围着,俗称防火长城。今天讲到代理模式,就来讲讲这道墙。这墙是这么实现的,我们上网,正常的网络是世界各地的网站我们都能访问,而加上这道墙,相当于在我们上网的时候做了一层代理,这一层代理把禁用的网站给过滤掉,使得我们没法访问被禁用的网站。下面通过代码来讲解。

定义一个互联网接口,里面有一个访问网站的通用方法 access

代码语言:javascript
复制
/**
 * 互联网
 */
interface Internet {

    String access(String domain);

}

定义世界范围内的网络类,可以访问任何存在的网站。

代码语言:javascript
复制
/**
 * 世界网络
 */
class WorldNetwork implements Internet {

    @Override
    public String access(String domain) {
        System.out.println("访问网站:" + domain);
        return domain + "网站内容";
    }

}

定义中国的网络类,就是代理类,实现墙的功能。disable 对象存储了在国内禁止访问的网站,用户在访问网站时(也就是调用 access 访问)先判断网站是不是在禁用的网站集合里面,如果是则禁用,如果不是则继续访问。

代码语言:javascript
复制
/**
 * 中国网络(就是代理)
 */
class ChinnessNetwork implements Internet {

    private Set<String> disable;

    private Internet internet;

    public ChinnessNetwork(Internet internet) {
        this.internet = internet;
        this.disable = new HashSet<>();
        this.disable.add("www.google.com");
        this.disable.add("www.facebook.com");
    }

    @Override
    public String access(String domain) {
        if (disable.contains(domain)) {
            System.out.println("禁止访问该网站:" + domain);
            return "禁止访问该网站:" + domain;
        }
        return internet.access(domain);
    }
}

测试代码,ChinnessNetwork 作为代理类,WorldNetwork 作为被代理类。

代码语言:javascript
复制
public class ProxyTest {

    public static void main(String[] args) {
        WorldNetwork worldNetwork = new WorldNetwork();
        ChinnessNetwork chinnessNetwork = new ChinnessNetwork(worldNetwork);
        chinnessNetwork.access("www.google.com");
        chinnessNetwork.access("www.baidu.com");
    }

}

打印结果:
禁止访问该网站:www.google.com
访问网站:www.baidu.com

看到结果,万能的 google 被屏蔽在外,我们只能默默用 baidu。

总结

代理模式简单说就是在原来对象的功能基础上加上额外的功能,在工作开发中这个很好用,比如我们要统计系统中各方法执行的时间,就可以用代理模式来实现。开源框架中也用得很多,比如 Spring 的 AOP 等等。

上面简单的分享了代理模式,也是最简单的一个代理模式,名称叫静态代理。在开发中用的最多的是动态代理,基于这篇文章主要讲述设计模式的基础内容,后面找个机会再分享动态代理的内容。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 LieBrother 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 你要的故事
  • 总结
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档