帮我们找房租房买房的代理模式

Redis中什么是Big Key(大key)问题?如何解决Big Key问题? 通俗易懂的讲,Big Key就是某个key对应的value很大,占用的redis空间很大,本质上是大value问题。key往往是程序可以自行设置的,value往往不受程序控制,因此可能导致value很大。redis中这些Big Key对应的value值很大,在序列化/反序列化过程中花费的时间很大,因此当我们操作Big Key时,通常比较耗时,这就可能导致redis发生阻塞,从而降低redis性能。用几个实际的例子对大Key的特征进行描述:● 一个String类型的Key,它的值为5MB(数据过大); ● 一 阅读详情

前言

大家好,看到这个标题大家应该想到了是中介,中介可以帮我们租房找房买房办手续等等,让我们在整个租房买房过程中轻松很多。生活中还有售票黄牛、婚介、经纪人、快递、事务代理、非侵入式日志监听等,都是代理模式的实际体现。

代理模式(Proxy Pattern)是指为其他对象提供一种代理,以控制对这个对象的访问,属于结构型模式。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。

通用UML类图:

使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。代理模式分为静态代理和动态代理,下面我们来分别看下。

静态代理

就拿中介来举例子,创建顶层接口IPerson。

public interface IPerson {
    void findHouse();
}

张三要租房了,实现IPerson接口,创建ZhangSan类。

public class ZhangSan implements IPerson {
    @Override
    public void findHouse() {
        System.out.println("张三要求:离地铁站近、面积大");
    }
}

但是张三初来乍到,对当地不熟悉,需要中介来帮他找,创建一个中介类HouseProxy,同样实现IPerson接口。这里面需要把张三对象传进来,然后中介帮他找房。

public class HouseProxy implements IPerson {

    private ZhangSan zhangsan;

    public HouseProxy(ZhangSan zhangsan) {
        this.zhangsan = zhangsan;
    }

    @Override
    public void findHouse() {
        System.out.println("中介开始帮你找房");
        zhangsan.findHouse();
        System.out.println("成功找到啦");
    }
}

写个测试类测试一下

    public static void main(String[] args) {
        HouseProxy proxy = new HouseProxy(new ZhangSan());
        proxy.findHouse();
    }

运行结果如下图:

静态代理的应用我们每天都在用,小伙伴在写service层的时候,会把dao层给注入进来,就像这样一样,其实这个就是静态代理。

public class Service{

    @Autowired
    private OrderDAO dao;
    
    public void insertOrder() {
        //处理业务逻辑
        ...
        dao.insertOrder();
        //处理业务逻辑
        ...
    }
}

静态代理有缺点:

(1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。

(2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法,违背了开闭原则。

动态代理

基于上面的问题就出现了动态代理,动态代理的底层实现一般不用我们自己亲自去实现,已经有很多现成的API。在Java生态中,目前最普遍使用的是JDK自带的代理和Cglib提供的类库。下面我们来分别演示一下写法。

JDK动态代理

首先创建一个中介类JDKIntermediary:

public class JDKIntermediary implements InvocationHandler {

    private IPerson target;

    public IPerson getInstance(IPerson target) {
        this.target = target;
        Class<?> clazz = target.getClass();
        return (IPerson) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(this.target, args);
        after();
        return result;
    }

    private void before() {
        System.out.println("我是中介,我要开始给你找房了");
    }

    private void after() {
        System.out.println("成功找到啦..");
    }

}

再创建一个李四类:

public class LiSi implements IPerson {

    @Override
    public void findHouse() {
        System.out.println("李四要求:便宜");
    }

}

测试代码如下:

    public static void main(String[] args) {
        JDKIntermediary intermediary = new JDKIntermediary();
        IPerson zhangsan = intermediary.getInstance(new ZhangSan());
        zhangsan.findHouse();

        IPerson lisi = intermediary.getInstance(new LiSi());
        lisi.findHouse();
    }

运行结果如下:

CGLib

还是以中介为例,创建CGlibIntermediary类:

public class CGlibIntermediary implements MethodInterceptor {

    public Object getInstance(Class<?> clazz) {
        //相当于Proxy,代理的工具类
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        before();
        Object obj = methodProxy.invokeSuper(o, objects);
        after();
        return obj;
    }

    private void before() {
        System.out.println("我是中介,我要开始给你找房了");
    }

    private void after() {
        System.out.println("成功找到啦..");
    }

}

创建一个客户类Customer:

public class Customer {

    public void zufang() {
        System.out.println("找一个预算两千的房子");
    }

}

有一个小细节,CGLib代理的目标对象不需要实现任何接口,它是通过动态继承目标对象实现动态代理的。来看测试代码:

    public static void main(String[] args) {
        Customer obj = (Customer) new CGlibIntermediary().getInstance(Customer.class);
        obj.zufang();
    }

执行结果:

动态代理在Spring中的应用

大家知道在Spring中事务的底层是AOP,而AOP的底层用的就是动态代理,这里有两个重要的类 JdkDynamicAopProxy 和 CglibAopProxy,它们的类图如下:

image.png

Spring中使用代理的原则是:

  • 当Bean有实现接口时,Spring就会用JDK动态代理
  • 当Bean没有实现接口时,Spring会选择CGLib代理
  • Spring可以通过配置强制使用CGLib代理,只需要在Spring的配置文件中加入如下代码:
<aop:aspectj-autoproxy proxy-target-class="true"/>

JDK和CGLib动态代理对比

(1)JDK动态代理实现了被代理对象的接口,CGLib代理继承了被代理对象。

(2)JDK动态代理和CGLib代理都在运行期生成字节码文件,JDK动态代理直接写Class字节码,CGLib代理使用ASM框架写Class字节码,CGLib代理实现更复杂,生成代理类比JDK动态代理效率低。

(3)JDK动态代理调用代理代理方法是通过反射机制调用的,CGLib代理是通过FastClass机制直接调用方法的,CGLib代理的执行效率更高。

代理模式的优缺点

最后说下代码模式的优缺点,优点:

  • 代理模式能将代理对象与真实被调用目标对象分离。
  • 在一定程度上降低了系统的耦合性,扩展性好。
  • 可以起到保护目标对象的功能。
  • 可以增强目标对象的功能。
    缺点:
  • 代理模式会造成系统设计中类的数量增加。
  • 在客户端和目标对象中增加一个代理对象,会导致请求速度变慢。
  • 增加了系统复杂度。
    本文及其他设计模式的源码在此链接下,https://github.com/xuhaoj/pattern-demo ,谢谢大家的观看,如果觉得不错,请点一个赞!
Anasys Workbanch实战解析:齿轮接触强度有限元分析全流程 本文详细解析了在Anasys Workbanch中进行齿轮接触强度有限元分析的全流程。从模型简化、材料赋予、接触对设置,到网格划分艺术、非线性接触求解调试,再到结果后处理与工程解读,提供了避开常见陷阱的实战经验,旨在帮助工程师精准评估齿轮强度与疲劳寿命。 阅读详情

相关推荐

计算机视觉:暗通道去雾算法的原理及python实现

在绝大多数非天空的局部区域中,某些像素总会至少有一个颜色通道的值很低。对于一幅图像J(x),其暗通道的数学定义表示如下:其中,Ω(x)表示以x为中心的局部区域,上标c表示RGB三个通道。该公式的意义用代码表达也很简单,首先求出每个像素RGB分量中的最小值,存入一副和原始图像大小相同的灰度图中,然后再对这幅灰度图进行最小值滤波,滤波的半径由窗口大小决定。

weixin_51998427的博客 1万+

模式源于生活:代理模式---中介租房

代理模式产生的原因:一、客户无法直接获得对象的引用来调用它的方法。二、代理需要对被代理的对象进行预处理或后处理。 以我找工作时租房未背景来阐述下中介中用到的代理模式: 对于租客我来说,我曾经跑到小区里转转,希望能看到贴着租房信息的小广告以便直接联系到房主,这样的话就可以省去中介的费用了。可是,转了几个小区了,发现现在的房东已经不流行在墙上贴小广告了,他们更愿意把房源信息放在中介那里,这样对于他

小新正在敲代码 785

飞塔防火墙和paloalto防火墙构建ipsec

一、配置fortigate防火墙1.防火墙配置上网功能1.1配置fortigate的wan1接口IP为100.100.100.2/24VLAN交换internal,IP地址为192.168.156.99/24。开启DHCP分配IP地址范围为192.168.156.110-192.168.156.2101.2配置访问互联网的缺省路由1.3配置访问互联网的安全策略2.配置与Paloalto防火墙的IPSECVPN。

weixin_44675999的博客 3738

代理模式-以房屋中介说明

代理模式举例介绍,包含静态代理、动态代理

IT从业者,生活精致一点,工作认真一点! 679

MDB协议中设备级别和选项(Levels and Options)

MDB协议的LEVEL级别介绍

hbstart的博客 939

VHDL按键消抖(状态机版本)

检测下降沿:设置一个和,分别代表之前的之前和之前的信号状态,若两个信号key_in_d2=1,key_in_d1=0,他俩的not key_in_d2 and key_in_d1为1,则说明下降沿产生,把它设置为标志位key_flag。延时计数:50MHz的板子每次计数需要20ns,而抖动时间大约为5-10ms。所以取7ms,作为延时时间。可以看见当检测到下降沿时,开始计数计数计满再次检测,若为低电平则为按下按键,否则为抖动。通过检测下降沿来临,延时计数再次检测,如果为低电平则为按键按下。

qq_69639216的博客 1084

23种模式之代理模式以房屋出租举例子

首先是一个租房子的接口! package com.fan.demo01; /** * およそ神 * 租房子接口 */ public interface Rent { void rent(); } 然后是房东来实现这个接口 package com.fan.demo01; /** * およそ神 * 房东房屋出租 */ public class Host implements Rent{ public void rent() { System.out.print

Fanzongshen的博客 494

实战MSP-M0G3507与陶晶驰串口屏的通信协议解析

本文详细解析了MSP-M0G3507微控制器与陶晶驰串口屏的通信协议实现。内容涵盖串口配置、协议帧结构、数据校验机制及ASCII协议实战代码,重点介绍了陶晶驰串口屏的指令集应用和调试技巧,为嵌入式开发提供可靠的串口通信解决方案。

h9j8k7l6m5n的博客 867

Java 设计模式之代理模式

代理模式,尤其动态代理,在我们的开发中及第三方库中应用广泛,本讲通过示例代码,来讨论静、动态代理原理及其实现方式等。

牛角尖 782

海康VisionMaster零代码开发实战:从PLC工程师到视觉专家的捷径

本文为PLC工程师提供了利用海康VisionMaster视觉平台实现零代码视觉开发的实战指南。文章详细阐述了如何通过图形化流程设计替代传统编程,快速搭建视觉检测应用,并实现与PLC的无缝通讯,是工程师从设备控制迈向视觉系统集成的有效捷径。

weixin_29201859的博客 293

milvus | 第 1 章:从“相似图片搜索”理解 Milvus 向量数据库

本文介绍了向量数据库Milvus的核心概念和基本架构。主要内容包括:1)向量数据库解决的是高维向量相似度检索问题,通过Embedding将非结构化数据转换为向量进行比较;2)Milvus作为分布式向量数据库,包含Proxy、Coordinator、QueryNode等多个组件协同工作;3)关键概念如Collection、Schema、Segment等构成了Milvus的数据组织方式;4)典型使用流程包括创建集合、插入数据、构建索引、加载数据和执行搜索五个步骤。文章为后续深入理解Milvus源码提供了基础知识

weixin_43674738的博客 133

设计模式--代理模式详解

本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删。 代理模式 代理模式( Proxy Pattern )是指为其他对象提供一种代理,以控制对这个对象的访问,属于结构型模式。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 先看下代理模式通用类图 代理模式一般包含三种角色︰ 抽象主题角色( Subject ):抽象主题类的主要职责是声明真实主题与代理的共同接口方法,该类.

想着百万年薪努力的小赵 963

OpenCV计算机视觉实战(3)——计算机图像处理基础

本文全面介绍了计算机视觉和数字图像处理的基础知识。从最基本的像素概念入手,详细讲解了图像在计算机中的表示方式,包括RGB、CMYK等色彩空间的工作原理及其应用场景。还系统分析了常见图像和视频文件格式的特点,梳理了计算机图像处理技术的发展历程,并重点介绍了OpenCV这一强大的开源计算机视觉库的功能与应用领域。

qq_30167691的博客 1740

spring--代理模式详解

由于某些原因需要给某对象提供一个代理以控制该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象与直接对象之间的中介。那生活中的例子来说,比如。客户要买房。房东有房,提供卖房服务,但房东不会带客户看房,于是客户通过中介买房。你可能无法理解这里中介是代替客户买房还是代替房东卖房,其实这是很好理解的。我们程序编写代码是为客户服务的,中介是代替一名服务商处理业务,这种服务可能被定义为卖房,也可能被定义为帮助客户买房。

m0_73856804的博客 1066

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++设计模式---代理模式

代理模式 定义 专业版描述:为其他对象提供一种代理以控制对这个对象的访问; 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 戏剧性描述:房产市场不稳定,房价涨了还是涨。隔壁老王要买房,忍痛找到房产中介,中介把房介绍给老王,老王买到中意房; 这个剧情中老王是主角,演绎了一个买房的故事。房产中...

辉哥仔 221

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

java设计模式---代理模式详解

代理模式超级详解

zhenghuishengq的博客 2197

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

c++设计模式之代理模式和中介模式 学习笔记

代理,代办,代劳,中介… 人的精力是有限的,不可能所有的事情都亲历亲为,而且术业有专攻,特定的事情更是需要专业人员才能做好。所以,在现实生活中,当我们遇到必须要办好,但是又没有时间,精力和渠道来深入理解的事情时,我们都会付出一定代价找懂行的人来帮忙——这其实就是代理。 举个栗子。以我自身为例吧,博主我正值青年,目前的人生头等大事无非就是:找女朋友,买房,买车,然后结婚。 上述的这些,其实都存在代理...

超级无敌大泡泡的博客 393

【设计模式】代理模式(静态代理)

文章目录一.代理模式综述二.静态代理 一.代理模式综述 代理(proxy)模式,顾名思义,就是通过中间代理人去操作对象。比如我们买房子,我们会通过房中介去购买房子一样。实际是为我们的对象去寻找一个替身,我们通过替身去操纵我们的对象。 被代理对象:远程对象,创建开销大的对象,需要远程控制的对象 代理模式:静态代理和动态代理(动态代理也叫JDK代理或者接口代理) 如下图所示,Client通过Proxy来操纵TargetObject. 二.静态代理 定义: 静态代理使用的时候需要定义接口或者父类,被代

北极星的博客 207

设计模式(二)代理模式

很重要的设计模式,Spring AOP也用到了。

zhj2003_的博客 159

23种设计模式#【代码示例】代理设计模式(静态&动态实现)

   代理可以理解为替代代理者完成的一些任务,可能是变的、可能需要一些专业知识、可能需要一些特定的资源…总之,这些任务,被代理者自己处理会很麻烦,那么我们就交给代理者完成。比如,拿生活中我们买房子的例子,一般买房子我们一般会找中介,中介能到了什么样的作用?资金监管、解读购房政策,因为更专业、拥有更丰富的资源、明白购房的手续等等,所以中介这个角色起到了至关重要的作用。同样在Java中,在执行某些类...

林大侠 402

JavaScript设计模式——代理模式

  代理模式属于设计模式中结构型的设计模式;   定义:   顾名思义就是为一个对象提供一个代用品或占位符,以便控制对它的访问!   白话解释:     很多明星都是有经纪人的,如果要联系明显进行商演或者开演唱会之类的商业活动通过是需要先跟经纪人取得联系的,跟经纪人谈好了合作事宜之后经纪人再转达给某明星,然后某明星才会去参加活动;同样租房也是一个同样的道理,我们不管是租房还是买房,第一...

有梦想的咸鱼前端 322

“代理模式”的应用

代理模式的工作原理 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象的一个替身。即代理对象。它可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。。 代理模式的 UML 类图如下: 代理模式包含如下角色: 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。 代理角色:实现抽象角

VIProgram的博客 607

Spring5设计模式 - 代理模式

设计模式 - 代理模式 -------目录直通车-------设计模式 - 代理模式一、静态代理二、动态代理模式三、静态代理和动态代理的区别四、代理模式在Spring中的应用五、代理模式的优缺点附:六、手写实现JDK的动态代理一、JDK实现方式二、手写实现JDK动态代理 两种模式:静态代理、动态代理。 两个目的:保护目标对象、增强目标对象。 定义:代理模式(Proxy Pattern)是指为其他对象提供一种代理,以控制对这个对象的访问,属于结构型模式。在某些情况下,一个对象不适合或者不能直接引用另一个对象,

DJun的博客 557

【设计模式与体系结构】代理模式

【设计模式与体系结构】代理模式 文章目录【设计模式与体系结构】代理模式一.实例分析二.代码实现三.实现结果 一.实例分析 (1) 代理模式设计一个房产中介的模拟程序。 要求:房产中介有介绍和代售南昌万科房子的权利,以及登记购房者信息权利。这里的房产中介是代理者,南昌万科是真实主题。 (2) 按照以上要求设计类图和编写Java源程序。 首先分析实例中的三个角色: 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,

weixin_53964368的博客 799

设计模式 — — 代理模式

缓存代理可以为一些开销大的运算结果提供暂时的存储,在下次运算时,如果传递进来的参数跟之前一致,则可以直接返回前面存储的运算结果。使用代理模式后,图片本地对象负责往页面中创建一个img标签,并且提供一个对外的setSrc接口;代理模式(Proxy Pattern)是为一个对象提供一个代用品或占位符,以便控制对它的。代理对象负责在图片未加载完成之前,引入预加载的loading图,负责了图片预加载的功能。虚拟代理把一些开销很大的对象,延迟到真正需要它的时候才去创建,,起到的作用就是代理。

情非得已小猿猿 395

设计模式04:代理模式

系列总链接:https://blog.youkuaiyun.com/qq_22122811/article/details/112360387 参考: https://www.cnblogs.com/daniels/p/8242592.html https://www.runoob.com/design-pattern/proxy-pattern.html https://blog.youkuaiyun.com/a369189453/article/details/81275740 一:概述 代理模式(proxy.

MatthewMao 239
上一篇: 手抓饼加生菜加鸡蛋的装饰器模式
下一篇: RocketMQ扫盲贴及Java API使用精讲
jack xu1
博客等级 码龄15年 5869粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值