看了tom老师讲的深入分析spring源码,讲的挺好,做个小总结

代理模式的定义:

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

比如:

租房中介、火车票黄牛、媒人、经纪人、快递

这些人和你之间的关系可以算作为代理模式,在我需要租房、买票、拿快递时我可以找一个这个中间人去替我办这件事

代理模式需要满足的特点:

1、执行者、被代理人

2、对于被代理人来说,这件事情是一定要做的,但是我自己又不想做或者没有时间做,找代理。

3、需要获取到被代理的人个人资料。

代理模式和装饰模式区别:

代理模式关心的不是结果 是过程;装饰模式关心的是最终结果

下面是一个小demo,创建了一个媒婆代理帮你找对象功能:

文件结构

Person类:

  1. package spring;
  2. public interface Person {
  3. void findLove();
  4. }

Zhansan类:

  1. package spring;
  2. public class Zhansan implements Person{
  3. private String sex = "女";
  4. private String name = "Zhansan";
  5. @Override
  6. public void findLove() {
  7. System.out.println("我叫:"+this.name+" 性别:"+this.sex);
  8. System.out.println("我要找高富帅");
  9. }
  10. }

Meipo类:

  1. package spring;
  2. import java.lang.annotation.Target;
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Proxy;
  6. public class Meipo implements InvocationHandler{
  7. private Person target;
  8. //获取被代理人的个人资料
  9. public Object getInstance(Person target) {
  10. this.target = target;
  11. Class clazz = target.getClass();
  12. //生成代理对象:3个参数:ClassLoader类加载器 实现接口,代理人
  13. System.out.println("被代理对象是:"+clazz);
  14. return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
  15. }
  16. @Override
  17. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  18. System.out.println("我是媒婆,准备介绍");
  19. System.out.println("------------");
  20. this.target.findLove();
  21. System.out.println("------------");
  22. return null;
  23. }
  24. }

测试类:

  1. package spring;
  2. public class TestFindLove {
  3. public static void main(String[] args) {
  4. Person obj = (Person) new Meipo().getInstance(new Zhansan());
  5. System.out.println(obj.getClass());
  6. obj.findLove();
  7. /*原理:
  8. * 1 拿到带代理对象的引用,然后获取它的接口
  9. * 2 jdk代理重新生成一个类,同时实现我们给的代理对象所实现的接口
  10. * 3 把被代理对象的引用也拿到了
  11. * 4 重新动态生成一个class字节码
  12. * 5 编译
  13. */
  14. }
  15. }

输出结果:

可以看到,测试类中虽然new的是一个zhangsan类 但是obj.getClass()的输出是代理类com.sun.proxy.$Proxy0

Spring中常用的设计模式之:代理模式的更多相关文章

  1. spring 中常用的设计模式

    一. Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模 ...

  2. Android开发中无处不在的设计模式——动态代理模式

    继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...

  3. JS常用的设计模式(5)——代理模式

    代理模式的定义是把对一个对象的访问, 交给另一个代理对象来操作. 举一个例子, 我在追一个MM想给她送一束花,但是我因为我性格比较腼腆,所以我托付了MM的一个好朋友来送. 这个例子不是非常好, 至少我 ...

  4. Java开发中常用的设计模式(一)---工厂模式

    一. 准备工作 1. 本文参考自  自己理解的工厂模式,希望对大家有所帮助 二. 开始 以汽车工厂为例,首先有个汽车类的接口 Car,里面有个开车的方法 drive(),然后有个宝马车的类 BMW 和 ...

  5. Java开发中常用的设计模式(三)---建造者模式

    一. 模式结构 建造者模式主要包含四个角色: Product:产品角色. Builder:抽象建造者.它声明为创建一个Product对象的各个部件指定的抽象接口. ConcreteBuilder:具体 ...

  6. Spring中常用的23中设计模式

    1.spring 中常用的设计模式有23中  分类  设计模式  创建型 工厂方法模式(FactoryMethod).抽象工厂模式(AbstractFactory).建造者模式(Builder).原型 ...

  7. Spring中常见的设计模式——委派模式

    一.委派模式的定义及应用场景 委派模式(Delegate Pattern)的基本作用是负责任务的调用和分配,跟代理模式很像,可以看做特殊情况下的静态的全权代理,但是代理模式注重过程,而委派模式注重结果 ...

  8. Java中常用的设计模式代码与理解

    Java中常用的设计模式代码与理解 一.单例模式 1.饿汉式 (太饿了,类加载的时候就创建实例) /** * 饿汉式单例模式 */ public class HungrySingleInstance ...

  9. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

随机推荐

  1. [MyBatis]向MySql数据库插入一千万条数据 批量插入用时6分 之前时隐时现的异常不见了

    本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 这次实验的环境仍然和上 ...

  2. 【互联网运营P1】

    一.导论 [运营]是什么 二.运营的职业分工和职能发展 三.转化型文案 4个高转化率短文案的常见姿势 2个短文案写作的核心要则 中长型转化文案的写作 针对所有问题点依次进行详细解读 四.第三方推广 常 ...

  3. 数据库 | Redis 缓存雪崩解决方案

    Redis 雪崩 缓存层承载着大量的请求,有效保护了存储层.但是如果由于缓存大量失效或者缓存整体不能提供服务,导致大量的请求到达存储层,会使存储层负载增加,这就是缓存雪崩的场景. 解决缓存雪崩,可以从 ...

  4. 慎用String.intern()作为synchronized的对象锁

    https://www.cnblogs.com/yhlx/p/3498387.html

  5. smb服务问题解析,区别红帽6和CentOS7

    最近在学习smb服务,哇!简直问题多的不要不要的.因为以前是学习的红帽6的系统,现在用的是CentOs7,所以还是改不了以前的一些配置方式,造成了很多问题.快成地中海了! 我们准备环境: 系统: 服务 ...

  6. 一百二十二:CMS系统之页面抽离和登录页面

    将登录和注册需要的共性标签抽离出来做父模板 将css改名为base base模板 {% from 'common/_macros.html' import static %}<!DOCTYPE ...

  7. centos 设置dns

  8. 想了解Java后端学习路线?你只需要这一张图!

    前言 学习路线图往往是学习一样技术的入门指南.网上搜到的Java学习路线图也是一抓一大把. 今天我只选一张图,仅此一图,足以包罗Java后端技术的知识点.所谓不求最好,但求最全,学习Java后端的同学 ...

  9. 【JAVA开发】eclipse最新版本Eclipse Neon

    这个版本的IDE支持Java.JavaScript.C/C++.PHP和Fortran等多种编程语言: 这个版本首次鼓励用户使用Eclipse Installer来做安装,这是一种由Eclipse O ...

  10. 小菜鸟之servlet

    # Servlet课程-1和2和3 容 Web项目 项目代码部署在服务器上, 一般分为c\s(客户端\服务器端)和b\s(浏览器/服务器) 服务器 常用的服务器(tomcat服务器) tomcat的目 ...