代理模式 深入理解 Java 动态代理机制
设计模式文章中介者模式代理模式桥接模式抽象工厂模式详解 —— head first 设计模式装饰者模式适配器模式策略模式观察者模式建造者模式 (Builder)概述代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。 在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。 举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。 代理模式的结构与实现代理模式的结构比较简单,主要是通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问,下面来分析其基本结构和实现方法。 代理模式的主要角色如下。
其结构图如图 所示。 为什么要用代理模式?
代理模式的定义与特点代理模式的主要优点有:
其主要缺点是:
有哪几种代理模式?我们有多种不同的方式来实现代理。如果按照代理创建的时期来进行分类的话, 可以分为两种:静态代理、动态代理。 静态代理是由程序员创建或特定工具自动生成源代码,在对其编译。在程序员运行之前,代理类 .class 文件就已经被创建了。动态代理是在程序运行时通过反射机制动态创建的。 1、静态代理?第一步:创建服务类接口 package main.java.proxy; public interface BuyHouse { void buyHosue(); } 第二步:实现服务接口 import main.java.proxy.BuyHouse; class BuyHouseImpl implements BuyHouse { @Override buyHosue() { System.out.println("我要买房"); } } 第三步:创建代理类 main.java.proxy.impl; class BuyHouseProxy BuyHouse { private BuyHouse buyHouse; public BuyHouseProxy(final BuyHouse buyHouse) { this.buyHouse = buyHouse; } @Override buyHosue() { System.out.println("买房前准备"); buyHouse.buyHosue(); System.out.println("买房后装修"); } } 第四步:编写测试类 main.java.proxy.impl.BuyHouseImpl; main.java.proxy.impl.BuyHouseProxy; class ProxyTest { static main(String[] args) { BuyHouse buyHouse = new BuyHouseImpl(); buyHouse.buyHosue(); BuyHouseProxy buyHouseProxy = BuyHouseProxy(buyHouse); buyHouseProxy.buyHosue(); } } 静态代理总结: 优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。 缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。? 2、动态代理在动态代理中我们不再需要再手动的创建代理类,我们只需要编写一个动态处理器就可以了。真正的代理对象由JDK再运行时为我们动态的来创建。 关于动态代理的实现,以及源码的分析,可以参看我之前写的文章:深入理解 Java 动态代理机制 代理模式的应用场景前面分析了代理模式的结构与特点,现在来分析以下的应用场景。
代理模式和装饰器模式的区别让别人帮助你做你并不关心的事情,叫代理模式 为让自己的能力增强,使得增强后的自己能够使用更多的方法,拓展在自己基础之上的功能的,叫装饰器模式。 对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个接口。 对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。他们之间的边界确实比较模糊,两者都是对类的方法进行扩展,具体区别如下:
? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |