博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结构型模式:代理模式
阅读量:5014 次
发布时间:2019-06-12

本文共 2230 字,大约阅读时间需要 7 分钟。

文章首发:

3840218d4b114ce98db47fe28fdf6941_0029_01.jpg

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

简介

姓名 :代理模式

英文名 :Proxy Pattern

价值观 :为生活加点料

个人介绍

Provide a surrogate or placeholder for another object to control access to it.
为其他对象提供一种代理以控制对这个对象的访问。
(来自《设计模式之禅》)

你要的故事

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

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

/** * 互联网 */interface Internet {    String access(String domain);}

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

/** * 世界网络 */class WorldNetwork implements Internet {    @Override    public String access(String domain) {        System.out.println("访问网站:" + domain);        return domain + "网站内容";    }}

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

/** * 中国网络(就是代理) */class ChinnessNetwork implements Internet {    private Set
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 作为被代理类。

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 等等。

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

好了,6 篇原则 + 23 篇设计模式已经完结了。所有的文章都整理在『设计模式』菜单里面,如下图所示,方便大家忘记了可以再瞄一眼。后面准备把这 29 篇文章整理成 PDF 分享给大家。

设计模式系列

推荐阅读

公众号后台回复『大礼包』获取 Java、Python、IOS 等教程

加个人微信备注『教程』获取架构师、机器学习等教程

LieBrother

转载于:https://www.cnblogs.com/liebrother/p/10867421.html

你可能感兴趣的文章
windows 中的类似于sudo的命令(在cmd中以另一个用户的身份运行命令)
查看>>
java===单类设计模式之饿汉式与懒汉式
查看>>
BZOJ 1083: [SCOI2005]繁忙的都市
查看>>
Maven 编译
查看>>
《学习之道》第十章学习方法29还记得散步的好处嘛
查看>>
Git常用命令总结
查看>>
iOS获取设备IP地址
查看>>
JavaSE| String常用方法
查看>>
NRF51822配对绑定要点
查看>>
C语言博客作业—数据类型
查看>>
浅谈React工作原理
查看>>
WPF基础之几何图形
查看>>
MySQL中的外键是什么、有什么作用
查看>>
POJ 1222 EXTENDED LIGHTS OUT
查看>>
JavaScript向select下拉框中加入和删除元素
查看>>
定义和实现二叉树
查看>>
mousewheel 与 DOMMouseScroll
查看>>
怎样用css写出一个下拉菜单
查看>>
[剑指offer] 55. 链表中环的入口结点
查看>>
状态模式(State)
查看>>