代理模式是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,通俗的来讲代理模式就是我们生活中常见的中介。

  这里有也很详细的讲解:代理模式

   Spring 的AOP面向切面就是使用动态代理模式来实现的;

   打个比方说:我要买房,但是我对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人(中介)去帮我找,此处的代理就是这个意思。

  代理类分为静态代理类和动态代理类:

  首先看下静态代理类,代码如下:

  接口:

public interface Source {
void method();
}

  委托类:

/**
* 委托类
*/
public class RealSubject implements Source {
@Override
public void method() {
System.out.println("我要去买房了");
}
}

  1、静态代理类:

/**
* 静态代理类
*/
public class ProxySubject implements Source{ private RealSubject realSubject; public ProxySubject() {
this.realSubject = new RealSubject();
} @Override
public void method() {
before();
realSubject.method();
after();
} void before(){
System.out.println("找房");
} void after(){
System.out.println("买房后装修");
}
}

  测试类:

public class Text {
public static void main(String[] args) {
Source source = new ProxySubject();
source.method();
}
}

  输出结果:

找房
我要去买房了
买房后装修

  静态代理总结:

  优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。

  缺点:我们得为每一个服务都创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。

   2、动态代理类

  动态代理类中我们不需要手动的创建代理类,我们只需要手动的编写一个动态处理器就可以了,真正的代理对象由JDK在运行时为我们动态的进行创建;

  Dynamic代理模式相对于静态代理,大大减少了我们的开发任务,同时减少了对业务接口的依赖,降低了耦合度;

  动态代理的实现依靠于InvocationHandler接口和Proxy类来实现的,每一个动态代理类中都必须要实现InvocationHandler接口,该接口中有唯一的invoke()方法;

  该方法的作用就是得到一个动态的代理对象,其接收三个参数:

loader:  第一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载

interfaces:  第二个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了

h:  第三个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上

  我们来看一下代码:

  首先定义一个接口,有两个方法

public interface Source {
void describe();
void buyHourse();
}

  给该接口定义一个实现类,其实就是我们的委托对象 

public class SourceImpl implements Source {
@Override
public void describe() {
System.out.println("中國風");
}
@Override
public void buyHourse() {
System.out.println("购房");
}
}

  定义动态代理类,注意一定要实现接口 InvocationHandler

public class DynamicProxy implements InvocationHandler{

    /**这个就是要代理的委托对象,使用Object类型,可以代理不同类型的对象,便于复用*/
private Object source; /**构造器,给要代理的对象赋值*/
public DynamicProxy(Object source) {
this.source = source;
} /*
我的理解:当我们通过动态代理对象调用委托对象的方法时会执行该方法
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
/*当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用*/
method.invoke(source,args);
after();
return null;
} void before(){
System.out.println("调用对象方法前执行的业务逻辑");
} void after(){
System.out.println("调用对象方法后执行的业务逻辑");
}
}

  测试类

public class Test {
public static void main(String[] args) {
//要代理的真实对象
Source realSource = new SourceImpl();
//创建handler实例,我们要代理哪个对象就把该对象传进去,最后通过该真是对象来调用其方法
InvocationHandler handler = new DynamicProxy(realSource);
/**
* 通过Proxy.newProxyInstance方法来创建代理对象,
* 第一个参数是目标对象的类加载器,获取方法为geiClassLoader()
* 第二个参数是一个Interface对象的数组,表示的是将要给需要代理的对象提供一组什么借口,
* 如果我提供了一组接口给它,那么这个代理对象就可以实现该接口(多态),
* 这样就能调用这组接口中的方法了
* 这里我们为代理对象提供的接口是真实对象所实行的接口,表示要代理的是该真是对象,
* 这样就可以调用这组接口中的方法了
* 第三个参数handler,指定的动态代理处理器,将该动态处理器传入真实的代理对象,即委托类对象
*/
Source source = (Source) Proxy.newProxyInstance(Source.class.getClassLoader(),
realSource.getClass().getInterfaces(),handler);
source.describe();
System.out.println("");
source.buyHourse();
}
}

  输出结果

调用对象方法前执行的业务逻辑
中國風
调用对象方法后执行的业务逻辑 调用对象方法前执行的业务逻辑
购房
调用对象方法后执行的业务逻辑

  OK,至此两个常见的代理模式就到这里了,明天说一下使用第三方插件实现的CGLIB代理模式;下班了回家!!祝大家中秋节快乐!!!

持续更新中...

参考链接: https://www.cnblogs.com/daniels/p/8242592.html

      https://www.cnblogs.com/xiaoluo501395377/p/3383130.html

  

java设计模式自我总结---代理模式的更多相关文章

  1. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  2. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  3. Java设计模式学习记录-代理模式

    代理模式 代理模式是常见设计模式的一种,代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

  4. Java设计模式:Proxy(代理)模式

    概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...

  5. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  6. java设计模式-----11、代理模式

    Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问. 所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类,客户端必须通过代 ...

  7. 《Java设计模式》之代理模式 -Java动态代理(InvocationHandler) -简单实现

    如题 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式可细分为如下, 本文不做多余解释 远程代理 虚拟代理 缓冲代理 保护代理 借鉴文章 ht ...

  8. Java设计模式—Proxy动态代理模式

    代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...

  9. Java设计模式9:代理模式

    代理模式 代理模式的定义很简单:给某一对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结构 有些情况下,一个客户不想活着不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间 ...

随机推荐

  1. js语言规范_ES5-6-7_个人总结

    ## **理解ES** 1. 全称: ECMAScript 2. js语言的规范 3. 我们用的js是它的实现 4. js的组成   * ECMAScript(js基础)   * 扩展-->浏览 ...

  2. WEB通知和React Native之即时通讯(iOS Android)

    WEB通知和React Native之即时通讯(iOS Android) 一,需求分析 1.1,允许服务器主动发送信息给客户端,客户端能监听到并且能接收. 1.2,为了方便同一个系统内的用户可以指定某 ...

  3. Python——sys模块

    七.sys模块 sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传递参数. sys.exit([arg]): 程序中间的退出,arg=0为正常退出. sys.getdefaulten ...

  4. fedora上安装ffmpeg

    环境 fedora26 1. 安装 yasm sudo dnf install yasm yasm-devel -y 2.安装 ffmpeg 官方下载ffmpeg源码  ( http://ffmpeg ...

  5. 【数学建模】偏最小二乘回归分析(PLSR)

    PLSR的基本原理与推导,我在这篇博客中有讲过. 0.偏最小二乘回归集成了多元线性回归.主成分分析和典型相关分析的优点,在建模中是一个更好的选择,并且MATLAB提供了完整的实现,应用时主要的问题是: ...

  6. P1137 旅行计划

    /*拓扑排序去寻找点的拓扑序 便于DP,那么怎么去找 首先邻接表存边,然后dfs搜寻每一个点 最后进行拓扑排序,找到拓扑序*/ #include<bits/stdc++.h> ; ; us ...

  7. oracle表的操作SQL语句

    这篇文章的内容包括:表的増删改查,字段的増删改查,主键.外键.唯一.非空.默认约束的増删改   查看自己用户的所有表: select * from user_tab_comments;    www. ...

  8. position:sticky

    使用sticky定位可以简洁的实现固定功能 例如,左右布局页面,左侧菜单,右侧内容,内容区域滚动时,不希望菜单区域滚动,而是固定不动 以往要实现这个功能,需要使用fixed定位菜单,菜单脱离文档流,布 ...

  9. luogu4705玩游戏

    题解 我们要对于每个t,求一个(1/mn)sigma(ax+by)^t. 把系数不用管,把其他部分二项式展开一下: simga(ax^r*by^(t-r)*C(t,r)). 把组合数拆开,就变成了一个 ...

  10. 使用item来封装数据:

    一.item和field类: 1.使用Item类: 创建了类Bookitem,然后就可以使用: 2.item_pipeline: 我们可以使用item_pipeline对爬取的数据进行处理. 步骤: ...