前言
国内程序员好像普遍对百度都没好感,而且百度近些年产生了不少负面的新闻,像16年的魏则西事件,近期的导演吴京黑白照事件,以及最近作家六六斥百度李彦宏:“你是做搜索引擎还是骗子首领”,还有一件就是与程序员有关的:搜索Julia语言,在百度和Google得出首条搜索结果的差异性而被吐槽。Google虽然受欢迎,但是在国内因内容审查问题未解决而不能使用,如果我们要使用它就必须使用代理服务器,由于放置代理服务器的地区区域可以访问google,所以我们可以先访问代理服务器,通过代理服务器转发我们的请求。这是现实生活中的一种代理模式的实例,当然现实生活中这种实例很不少,像明星都有助理,打官司有代理律师等等,这种思想也可以用到我们程序设计中。
介绍
在设计模式中代理模式可以分为静态代理和动态代理,而动态代理根据代理的对象类型不同又可以分为Jdk动态代理和Cglib动态代理。
意图:为其他对象提供一种代理以控制对这个对象的访问。
主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
何时使用:想在访问一个类时做一些控制。
如何解决:增加中间层。
关键代码:实现与被代理类组合。
实现
近几年中国电影行业蓬勃发展,电影摄制需要的一种特殊演员->替身,主要任务是代替影片中原演员表演某些特殊的、高难度的动作和技能或原演员所不能胜任的惊险动作,如武打、骑术、驾车等。拍摄的时候虽然是替身在拍摄,但是呈现在荧幕前我们观众却不知道是替身而认为是明星的真实拍摄,代理模式也有这种特点,虽然是代理类在完成任务,但是呈现出来的却是真实类的实现。接下来我们以这种生活中的实例来作示例:
公共表演接口的定义
/** 表演 */ public interface Performance { void act(); }
一.静态代理
明星的实体类
/** 明星 */ public class Actor implements Performance { @Override public void act() { System.out.println("明星上场拍功夫电影"); } }
替身演员的实体类
/** * 替身演员<i style="color:transparent">本文来源gaodai$ma#com搞$$代**码)网8</i> */ public class Stuntman implements Performance { private Actor actor; @Override public void act() { if (actor == null) { actor = new Actor(); } System.out.println("替身演员表演跳火车."); actor.act(); System.out.println("替身演员表演空中360°旋转飞踢."); } }
执行Demo
public class ProxyPatternDemo { public static void main(String[] args) { System.out.println("------电影拍摄开始------"); Performance perform = new Stuntman(); perform.act(); System.out.println("------电影拍摄结束------"); } }
执行程序,输出结果:
——电影拍摄开始——
替身演员表演跳火车.
明星上场拍功夫电影
替身演员表演空中360°旋转飞踢.