结构型模式_代理模式

一、代理模式的基本介绍

  1. 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
  2. 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象
  3. 代理模式有不同的形式, 主要有三种:静态代理、动态代理 (JDK代理、接口代理)和 Cglib代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴) 。

二、静态代理

静态代理优缺点

  1. 优点:在不修改目标对象的功能前提下, 能通过代理对象对目标功能扩展
  2. 缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类
  3. 一旦接口增加方法,目标对象与代理对象都要维护

三、动态代理

动态代理模式的基本介绍

  1. 代理对象,不需要实现接口,但是目标对象要实现接口,否则不能用动态代理
  2. 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象
  3. 动态代理也叫做:JDK代理、接口代理

JDK中生成代理对象的API

  1. 代理类所在包:java.lang.reflect.Proxy
  2. JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:
    static Object newProxyInstance(ClassLoader loader, Class<?>[]
    interfaces,InvocationHandler h )

四、Cglib代理

Cglib代理模式的基本介绍

  1. 静态代理和JDK代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是Cglib代理
  2. Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书也将Cglib代理归属到动态代理。
  3. Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接 口.它广泛的被许多AOP的框架使用,例如Spring AOP,实现方法拦截
  4. 在AOP编程中如何选择代理模式:
    (1) 目标对象需要实现接口,用JDK代理
    (2)目标对象不需要实现接口,用Cglib代理
  5. Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类

五、静态代理模式简单案例

什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被代理的人能干活呀。
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的:

先定义一种类型的女人:
KindWomen.interface

package com.cbf4life.proxy; 
/**
* 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
*/
public interface KindWomen { 
 
//这种类型的女人能做什么事情呢?
public void makeEyesWithMan(); //抛媚眼 
public void happyWithMan(); //happy what? You know that!
}

一种类型嘛,那肯定是接口,然后定义潘金莲:
PanJinLian.java

package com.cbf4life.proxy; 
/**
* @author cbf4Life cbf4life@126.com
* I'm glad to share my knowledge with you all.
* 定一个潘金莲是什么样的人
*/
public class PanJinLian implements KindWomen { 
public void happyWithMan() { 
 System.out.println("潘金莲在和男人做那个....."); 
 }
 public void makeEyesWithMan() { 
 System.out.println("潘金莲抛媚眼"); 
 } 
}

再定一个丑陋的王婆:
WangPo.java

package com.cbf4life.proxy; 
/**
* 王婆这个人老聪明了,她太老了,是个男人都看不上,
* 但是她有智慧有经验呀,她作为一类女人的代理!
*/
public class WangPo implements KindWomen { 
private KindWomen kindWomen; 
 
public WangPo(){ //默认的话,是潘金莲的代理
 this.kindWomen = new PanJinLian(); 
 } 
 
//她可以是KindWomen的任何一个女人的代理,只要你是这一类型
public WangPo(KindWomen kindWomen){ 
 this.kindWomen = kindWomen; 
 } 
 
public void happyWithMan() { 
 this.kindWomen.happyWithMan(); //自己老了,干不了,可以让年轻的代替
 } 
public void makeEyesWithMan() { 
 this.kindWomen.makeEyesWithMan(); //王婆这么大年龄了,谁看她抛媚眼?!
 } 
}

两个女主角都上场了,男主角也该出现了:
XiMenQing.java

package com.cbf4life.proxy; 
/**
* 定义一个西门庆,这人色中饿鬼
*/
public class XiMenQing { 
 
/*
 * 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了,
 * 被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人
 * 收了不少好处费,那我们假设一下:
 * 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很!
 */
public static void main(String[] args) { 
 //把王婆叫出来
 WangPo wangPo = new WangPo(); 
 
 //然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏:
 wangPo.makeEyesWithMan(); //看到没,虽然表面上时王婆在做,实际上爽的是潘金莲
 wangPo.happyWithMan(); } 
}

在这里插入图片描述

那这就是活生生的一个例子,通过代理人实现了某种目的,如果真去掉王婆这个中间环节,直接是西
门庆和潘金莲勾搭,估计很难成就武松杀嫂事件。
那我们再考虑一下,水浒里还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个固管家苟合
的那个),这名字起的:“假使”,那我们也让王婆做她的代理:
把贾氏素描出来:
JiaShi.java

package com.cbf4life.proxy; 

public class JiaShi implements KindWomen { 
public void happyWithMan() { 
 System.out.println("贾氏正在Happy中......");
  } 
public void makeEyesWithMan() { 
 System.out.println("贾氏抛媚眼"); 
 } 
}

西门庆勾贾氏:
XiMenQing.java

package com.cbf4life.proxy; 
/**
* 定义一个西门庆,这人色中饿鬼
*/
public class XiMenQing { 
 
public static void main(String[] args) { 
 //改编一下历史,贾氏被西门庆勾走:
 JiaShi jiaShi = new JiaShi(); 
 WangPo wangPo = new WangPo(jiaShi); //让王婆作为贾氏的代理人
 
 wangPo.makeEyesWithMan(); 
 wangPo.happyWithMan(); 
 } 
}

在这里插入图片描述

说完这个故事,那额总结一下,代理模式主要使用了 Java 的多态,干活的是被代理类,代理类主要是
接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,
大家知根知底,你能做啥,我能做啥都清楚的很,同一个接口呗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值