1,代理模式的概念

代理模式:为其他对象提供一种代理,以控制对这个对象的访问(代理对对象起到中介的作用,可去掉功能服务或者添加额外的服务)

2,代理模式的分类

(1)远程代理:类似于客户机服务器模式

  为不同地址空间的对象提供局域网代表对象

    举例说明:通过远程代理监控各个店铺

  

(2)虚拟代理:根据需要将资源消耗很大的对象进行延迟,真正需要的时候进行创建

    举例说明:当对一个网页进行记载的时候,会先使用一张默认的图片代替要加载的图片,将文字等其他信息和默认的图片一起加载出来,在慢慢加载指定的图片。

(3)保护代理:控制对一个对象的访问权限

    举例说明:在浏览某个网站的时候,未登录状态,只能浏览网站,只有在登陆后才可以发帖。

(4)智能引用代理:提供对目标对象的额外的服务

    举例说明:火车票代购处,不仅提供了销售火车票的功能,还提供了电话预约的功能。

3,智能引用代理---静态代理:

模拟场景:车行驶的路上,代理添加新功能:记录行驶的时间

(1)在不使用代理的情况下:

S1:编写行驶接口类Moveable

package com.songyan.proxy;public interface Moveable {
void move();
}

S2:编写小汽车类实现Moveable接口

并实现Moveable中定义的行驶方法(move())

在行驶方法中获取运行开始时,运行结束时的时间,做差获取运行的时间,由于程序运行太快,使用Thread的sleep()休眠1秒

package com.songyan.proxy;import java.util.Random;public class Car implements Moveable {public void move() {long startTime=System.currentTimeMillis();System.out.println("汽车行驶的开始时间:"+startTime);//实现开车try {Thread.sleep(new Random().nextInt(1000));System.out.println("汽车行驶中");} catch (InterruptedException e) {e.printStackTrace();}long endTime=System.currentTimeMillis();System.out.println("骑车行驶的终止时间:"+endTime);System.out.println("汽车行驶时间共计:"+(endTime-startTime)+"毫秒~");}}

S3:编写测试类,是小汽车行驶

package com.songyan.proxy;public class Client {public static void main(String[] args) {Car car= new Car();car.move();}}

S4:运行结果

(2)代理实现记录汽车行驶的时间---继承

S1:新建Car2继承Car

S2:重写move方法

S3:将car中的记录时间的部分抽取出来,只留下汽车行驶的部分

package com.songyan.proxy;
/*** * @author sy*通过继承Car2实现对Car的代理*/
public class Car2 extends Car{@Overridepublic void move() {long startTime=System.currentTimeMillis();System.out.println("开始行驶~~~~");super.move();long endTime=System.currentTimeMillis();System.out.println("行驶结束~~~~~~~~~~");System.out.println("汽车行驶时间:"+(endTime-startTime)+"毫秒~");}}

package com.songyan.proxy;import java.util.Random;public class Car implements Moveable {public void move() {System.out.println("移动~~~~~~~~~~~~");try {Thread.sleep(new Random().nextInt(1000));} catch (InterruptedException e) {e.printStackTrace();}}}

S4:编写测试类测试

package com.songyan.proxy;public class Client {
public static void main(String[] args) {/*Car car=new Car();car.move();*/Moveable car2=new Car2();car2.move();
}
}

输出结果

(3)代理实现记录汽车行驶的时间---聚合

S1:编写Car3实现Moveable接口

S2:声明一个Car类型的变量

S3:并通过构造函数进行初始化

S4:重写move方法,调用car的move()在写逻辑代码。

package com.songyan.proxy;
/*** * @author sy* 通过聚合的方式实现代理*/
public class Car3 implements Moveable{private Car car;/*** 聚合:一个类当中*/public void move() {//计时开始long startTime=System.currentTimeMillis();System.out.println("开始行驶~~~~");//调用car的move方法
        car.move();//计时结束long endTime=System.currentTimeMillis();System.out.println("行驶结束~~~~~~~~~~");System.out.println("汽车行驶时间:"+(endTime-startTime)+"毫秒~");        }/*** 通过构造函数将car传进来* @param car*/Car3(Car car){super();this.car=car;}}

思考:以上是两种实现代理的方式,哪一种更好呢?

功能拓展:上面的代理中知识拓展了记录行驶时间的功能,如果需要实现功能叠加,两种方式有该如何实现?

(1)继承的方式

先记录日志在记录行驶时间:需要编写Car3继承Car.

先记录行驶时间,在记录日志:又需要编写Car4继承Car

不难看出继承的方式代码的可重用性不高

(2)聚合的方式(可以很好的解决上述问题)

S1:编写实现记录时间的代理类

package com.songyan.proxy;
/*** 记录时间的代理类* @author sy**/
public class CarTimeProxy implements Moveable
{private Moveable m;public void move() {System.out.println("时间记录开始~~");m.move();System.out.println("时间记录结束~~");}public CarTimeProxy(Moveable m){this.m=m;}
}

S2:编写记录日志的代理类

package com.songyan.proxy;
/*** 就日志的代理类* @author sy**/
public class CarLogProxy implements Moveable{private Moveable m;public void move() {System.out.println("log开始~~~~");m.move();System.out.println("log结束~~~~~~");}public CarLogProxy(Moveable m){this.m=m;}}

S3:编写测试类(1)先记录日志在记录时间

package com.songyan.proxy;
/*** 代理组合测试类* @author sy* 要求代理:先记录日志,在记录时间*/
public class CarTest {
public static void main(String[] args) {Moveable m=new Car();Moveable time=new CarTimeProxy(m);Moveable log=new CarLogProxy(time);log.move();
}
}

运行结果:

S4:编写测试类2(先记录时间在记录日志)

不行需要重新写代理类

只需要在调用的时候调整顺序即可

package com.songyan.proxy;
/*** 代理组合测试类* @author sy* 要求代理:先记录时间,在记录日志*/
public class CarTest {
public static void main(String[] args) {Moveable m=new Car();Moveable log=new CarLogProxy(m);Moveable time=new CarTimeProxy(log);time.move();
}
}

输出结果:

由上可以看出:聚合要比继承更好用。

思考:我们上面实现的都是对Car的代理,如果我们下需要对火车,自行车实现相同的代理,我们又该如何实现呢?

这里就需要用到动态代理技术了:具体请点击此处查看另一篇博客。

转载于:https://www.cnblogs.com/excellencesy/p/9121686.html

代理模式(Proxy)--静态代理相关推荐

  1. 代理模式之---静态代理

    代理模式之-静态代理 代理模式:为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 被代 ...

  2. 【Java】代理模式(静态代理动态代理)

    CONTENT 代理模式 静态代理 动态代理 JDK 动态代理(基于接口) CGLIB 动态代理(基于类继承) JDK 动态代理 v.s. CGLIB 动态代理 JDK 动态代理为什么必须基于接口 R ...

  3. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  4. 代理模式(Proxy) 静态

    代理模式分为静态和动态代理 由程序员创建或工具生成代理类的源码,再编译代理类.所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了. 所以说静态代理,主要是自己 ...

  5. Java的代理模式之静态代理和动态代理

    文章目录 静态代理 动态代理 jdk生成代理对象 cglib代理 代理模式简介: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目 ...

  6. 【学习笔记】结合代码理解设计模式 —— 代理模式(静态代理、动态代理、延伸)

    文章目录 什么是代理模式 一. 代理模式简介 二. 静态代理模式 三. 动态代理模式 万能模版 前言:笔记基于狂神设计模式视频.<大话设计模式>观后而写 (最近一直在更新之前的刷题博客,今 ...

  7. java代理模式之静态代理

    (一)静态代理 1.静态代码模式的介绍 静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类. 2.应用实例 具体要求: 1)定义一个接口:I ...

  8. 设计模式之代理模式(静态代理、Java动态代理、Cglib动态代理)

    代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 提醒:动态代理中涉及到以前的一些知识 ...

  9. 设计模式之代理模式(静态代理动态代理)

    目录 1.什么是代理模式 2.代理模式的结构 3.代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4.动态代理V ...

  10. 设计模式-代理模式(静态代理、动态代理、cglib代理)

    文章目录 代理模式 静态代理 动态代理 cglib代理 应用 代理模式 代理模式(Proxy Pattern)是一种结构性模式.代理模式为一个对象提供了一个替身,以控制对这个对象的访问.即通过代理对象 ...

最新文章

  1. 阅读豆丁网----基于模型的混合多目标算法的研究
  2. 安装tensorflow-gpu2.0 报错:ERROR: Cannot uninstall 'wrapt'
  3. zabbix监控服务器日志文件,Zabbix对服务器资源进行监控及百度告警的整合
  4. Retrofit 注解参数详解
  5. 分享几个神奇有效的Python学习网站
  6. python 获取几小时之前,几分钟前,几天前,几个月前,及几年前的具体时间
  7. HDU 1257 最少拦截系统 简单DP
  8. MATLAB中saveas函数使用
  9. 计算机cad名词解释,CAD全部名词解释
  10. excel白屏未响应_Excel中出现无响应的解决方法
  11. 数据结构,持续更新!!!
  12. win7 cmd 无法复制粘贴
  13. 在Linux中传输文件/目录的scp命令
  14. 蒜头君的藏书(映射)
  15. python将两个csv文件按列合并
  16. GDK8——强大的Linux内核调试工具
  17. 牛客网 A-吐泡泡 栈的模拟
  18. EXCEL转PDF,JACOB,生成checkbox
  19. 都在夸Vue文档简洁易懂?官方文档编写指南了解一下
  20. 赛博朋克2077配置要求2022

热门文章

  1. 设计模式学习笔记------简单工厂
  2. C#从新浪新闻上提取新闻标题
  3. 字符串处理 - ANSI - Unicode - UTF8 转换
  4. 蓝桥杯 ADV-121 算法提高 高精度加法
  5. 蓝桥杯 BASIC-2 基础练习 01字串
  6. 【C++】n_element的用法
  7. a标签download属性无效_使用这些 CSS 属性选择器来提高前端开发效率
  8. Microsoft.XMLHTTP基本用法
  9. oracle 时间戳
  10. AngularJs 入门系列-1 使用 AngularJs 搭建页面基本框架