• 概念

    王宝强有一个经纪人叫宋喆,这个经纪人很吊,可以代理王宝强做一系列的事情,与粉丝活动、王宝强的微博维护、安排王宝强的行程以及什么什么等等。如果王宝强一个人做岂不是累死。通过这个代理人为王宝强节省了不少。

    代理模式就是在不改变原有类的代码结构上为类拓展新的功能。

  • 类图:subject为一个抽象的目标接口,客户端梦想的接口,realSubject为原始类,proxy为代理对象

  

  • 静态代理
//原类与代理类的公共接口
public interface Subject {
public void request();
} public class RealSubject implements Subject{ public void request() {
System.out.println("王宝强拍电影");
}
} public class Proxy implements Subject {
private Subject realSubject; public void setRealSubject(Subject realSubject) {
this.realSubject = realSubject;
} public void request() {
System.out.println("宋喆代替王宝强维护微博");
realSubject.request();
System.out.println("宋喆代替王宝强与粉丝互动");
}
} public class Main {
public static void main(String[] args) {
Subject realSubject=new RealSubject();
Proxy proxy=new Proxy();
proxy.setRealSubject(realSubject);
proxy.request();
}
}
  • 动态代理
public interface Subject {
public void request();
} public class RealSubject implements Subject {
public void request() {
System.out.println("王宝强拍电影");
}
} public class ProxyMain {
public static void main(String[] args) {
final RealSubject realSubject=new RealSubject();
Subject proxy=(Subject) Proxy.newProxyInstance(
/**
* ClassLoader 被代理类的加载器
* Interfaces 代理对象与被代理对象公共接口
* InvocationHandle 事件处理
*/
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("宋喆代替王宝强维护微博");
Object returnValue=method.invoke(realSubject,args);
System.out.println("宋喆代替王宝强与粉丝互动");
return returnValue;
}
}
);
proxy.request();
}
}
  • Cglib代理
public class RealSubject {
public void request() {
System.out.println("王宝强拍电影");
}
} import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class ProxyFactory implements MethodInterceptor {
private Object realSubject;
public ProxyFactory(Object realSubject){
this.realSubject=realSubject;
}
public Object getProxyInstance(){
//1.工具类
Enhancer enhancer=new Enhancer();
//2.设置父类
enhancer.setSuperclass(realSubject.getClass());
//3.设置回调函数
enhancer.setCallback(this);
//4.创建子类
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
throws Throwable {
System.out.println("宋喆代替王宝强维护微博");
Object returnValue=method.invoke(realSubject,objects);
System.out.println("宋喆代替王宝强与粉丝互动");
return returnValue;
}
} public class Main {
public static void main(String[] args) {
RealSubject realSubject=new RealSubject();
RealSubject proxy=
(RealSubject)new ProxyFactory(realSubject)
.getProxyInstance();
proxy.request();
}
}
  • 区别:静态代理与JDK动态代理的区别在于一个是写类去组合目标对象,一个去写匿名内部函数,二者相同之处是原类与代理类必须共同实现目标接口。而Cglib则不用实现目标接口。前两者代码维护性相对于Cglib不方便。
  • 应用场景:AOP切面编程通常可以处理事务管理(开启事务、操作、提交事务)、安全检测(权限验证,进入)、缓存(访问数据库、存入缓存)。AOP默认使用动态代理。
代理对象:拦截真实业务对象的访问
代理对象应该具有和目标对象相同的方法
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
-ClassLoader loader:指明生成代理对象使用哪个类加载器
-Class<?>[] interfaces:指明生成哪个对象的代理对象
-InvocationHandler h:指明这个代理对象要做什么事情 public interface Person{ String sing(String name);
String dance(String name);
} public class LiuDeHua implements Person{
public String sing(String name){
...
}
public String dance(String name){
...
}
} public class LiuDeHuaProxy{ private Person ldh=new LiuDeHua(); public Person getProxy(){
return (Person)Proxy.newProxyInstance(
LiuDeHuaProxy.class.getClassLoader(),
ldh.getClass().getInterfaces(),
new InvocationHandler(){
@Override
public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{
if(method.getName().equals("sing")){
//调用了sing方法
...
return method.invoke(ldh,args);
}
if(method.getName().equals("dance")){
//调用了dance方法
...
return method.invoke(ldh,args);
}
}
}
)
}
}

基于JAVA的设计模式之代理模式的更多相关文章

  1. Java基础-设计模式之-代理模式Proxy

    代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理 ...

  2. Java常见设计模式之代理模式

    指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其它相关业务的处理.比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与 ...

  3. 基于JAVA的设计模式之组合模式

    概念 将所有对象组合成一种树形结构,有分支节点.叶子节点,分支节点可以有自己的子节点,子节点可以是分支节点.叶子节点,可以进行增删的操作,而叶子节点不可以.比如文件夹就是一个分支节点,而文件就是一个叶 ...

  4. java设计模式6——代理模式

    java设计模式6--代理模式 1.代理模式介绍: 1.1.为什么要学习代理模式?因为这就是Spring Aop的底层!(SpringAop 和 SpringMvc) 1.2.代理模式的分类: 静态代 ...

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

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

  6. 夜话JAVA设计模式之代理模式(Proxy)

    代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...

  7. Java设计模式:代理模式(转)

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.这里使用到编程中的一 ...

  8. Java的三种代理模式(Spring动态代理对象)

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  9. 基于java的设计模式入门(1)——为什么要学习设计模式

    大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...

随机推荐

  1. android和iOS平台的崩溃捕获和收集

    转自:http://www.cnblogs.com/lancidie/archive/2013/04/13/3019349.html 通过崩溃捕获和收集,可以收集到已发布应用(游戏)的异常,以便开发人 ...

  2. 转:使用 VisualVM 进行性能分析及调优

    使用 VisualVM 进行性能分析及调优 VisualVM 是一款免费的\集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括 ...

  3. pyjsonrpc模块使用

    pyjsonrpc模块的远程过程调用方法. # -*- coding:utf-8 -*- #!/usr/bin/env python2.7 # @Author : tianbao # @Contact ...

  4. Spring入门第七课

    Bean之间的关系:继承和依赖. 继承Bean配置 Spring允许继承bean的配置,被继承的bean称为父bean,继承这个父bean的Bean称为子Bean. 子Bean从父Bean中继承配置, ...

  5. 永恒之蓝(EternalBlue)MS17-010

    附加知识: 漏洞来源与背景: 这个漏洞最初是由NSA(美国国家安全局)发现的,但是他们发现漏洞他不讲,然后遭殃了吧. 后来 有一个黑客组织叫:Shadow Brokers (影子经纪人) 入侵了NSA ...

  6. Thinkphp5+plupload图片上传功能,支持实时预览图片。

    今天和大家分享一个国外的图片上传插件,这个插件支持分片上传大文件.其中著名的七牛云平台的jssdk就使用了puupload插件,可见这个插件还是相当牛叉的. 这个插件不仅仅支持图片上传,还支持大多数文 ...

  7. Docker Compose 多容器应用

    Docker Compose是一个用来定义并运行复杂应用程序的工具.用Compose,你可以在一个文件中定义多个容器应用程序,然后只需一条命令就可以完成使其运行所需的所有操作. 一个使用Docker容 ...

  8. $(this).index()与$(obj).index(this)的区别

    <div> <b>this is b</b> </div> <div> <p>this is span</p> &l ...

  9. codevs 3333 高级打字机

    3333 高级打字机   题目描述 Description 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作 ...

  10. 【Ionic+AngularJS 开发】之『个人日常管理』App(一)

      写在前面的话 过去一年自己接触了不少手机前端开发,得益于现在手机性能的提升和4G普及,感觉使用混合技术开发手机App已经可以满足越来越多的应用场景了.新年伊始,对自己2016年所学知识做一个阶段性 ...