最近在看spring的aop方面的知识,aop是基于动态代理模式实现的。所以顺便看了关于代理模式方面的知识点,现在把这些记录下来。
代理模式有两种实现:静态代理和动态代理。
代理模式涉及三个概念:委托(者)、代理(者)和主题接口。
听一个故事,找着与代理模式涉及的三个概念相对应的内容。
秀才作为一个委托者,委托(代理)媒婆去告诉姑娘自己的想法(比如要身材好、性感、知性、善良等),而媒婆必须要遵照秀才的约定的规则(接口)去告诉姑娘秀才的意愿。最终二者建立起感情,但是这个过程中两个人并没有参与进来,而是通过媒婆作为代理来传递信息。
一、静态代理
静态代理要求:代理类和被代理类都必须实现同一个接口,在代理类中实现事务操作等横切业务逻辑,被代理类中只保留核心业务逻辑。
缺点:当方法很多时,势必要为每个方法都要进行代理操作,导致增加了代码的复杂度,所以静态代理不能胜任方法较多的情况。
比如要在输出“HelloWorld”前打印一个字符串“Welcome”
A:先定义一个接口类
package proxy;
public interface HelloWorld {
public void print();
// public void say();
}
B: 定义一个该接口的实现类
package proxy;
public class HelloWorldImpl implements HelloWorld{
public void print(){
System.out.println("HelloWorld");
}
// public void say(){
// System.out.println("Say Hello!");
// }
}
C:定义一个静态代理类
package proxy;
public class StaticProxy implements HelloWorld{
public HelloWorld helloWorld ;
public StaticProxy(HelloWorld helloWorld){
this.helloWorld = helloWorld;
}
public void print(){
System.out.println("Welcome");
//相当于回调
helloWorld.print();
}
// public void say(){
// //相当于回调
// helloWorld.say();
// }
}
D: 一个测试类:
package proxy;
public class TestStaticProxy {
public static void main(String[] args){
HelloWorld helloWorld = new HelloWorldImpl();
StaticProxy staticProxy = new StaticProxy(helloWorld);
staticProxy.print();
// staticProxy.say();
}
}
二、动态代理
在java中要实现动态代理机制,则需要java.lang.reflect.InvocationHandler接口和java.lang.reflect.Proxy类的支持。
public interface InvocationHandler{
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}
参数:
proxy - 在其上调用方法的代理实例
method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类。
import java.lang.reflect.InvocationHandler ;
import java.lang.reflect.Proxy ;
import java.lang.reflect.Method ;
interface Subject{
public String say(String name,int age) ; // 定义抽象方法say
}
class RealSubject implements Subject{ // 实现接口
public String say(String name,int age){
return "姓名:" + name + ",年龄:" + age ;
}
};
class MyInvocationHandler implements InvocationHandler{
private Object obj ;
public Object bind(Object obj){
this.obj = obj ; // 真实主题类
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this) ;
}
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
Object temp = method.invoke(this.obj,args) ; // 调用方法
return temp ;
}
};
public class DynaProxyDemo{
public static void main(String args[]){
Subject sub = (Subject)new MyInvocationHandler().bind(new RealSubject()) ;
String info = sub.say("曾召帅",23) ;
System.out.println(info) ;
}
};
分享到:
相关推荐
Java设计模式——代理设计模式(静态代理和动态代理) 各种情况例子源码
java 代理模式实现代码及设计详解:动态代理模式、静态代理模式
NULL 博文链接:https://871656094.iteye.com/blog/2355335
此资源为文章中《代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)》与《 AOP动态代理声明式的3种配置方式过程与区别》的案例代码,可下载参考学习。
//代理模式内部引用了真实角色 public void requst() { this.preRequest(); //在真实角色操作之前所附加的操作 if(null == realsubject) { realsubject = new ReallSubject(); } realsubject.requst(); // ...
设计模式之代理模式_静态代理的一个java实现的demo。主类在Client中。仅代码实现,可供初学者参考使用
java设计模式【之】静态代理【源码】【场景:帮爸爸买菜】.rar * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用 * ...
自己编写的代理设计模式,示例中的代码绝对没有使用伪代码,是开发的项目真实案例,简单易懂
Java设计模式之代理模式 1.代理模式 1.1 静态代理 1.2 动态代理 1.3.代理模式使用原因和应用方面
描述了安卓代理模式的动态代理和静态代理两种代理方式的使用
静态代理总结: 优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。 缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。
设计模式之代理模式Java实现和类设计图,包括静态代理和动态代理
资源列举了设计模式中的静态代理和动态代理的简单java实现,jdk1.8版本经过测试验证,对于想学习设计模式的童靴应该有所帮助
在代理模式中,主要有两种类型:静态代理和动态代理。 1.静态代理: 静态代理是指在编译期间就已经确定代理类和被代理类的关系,需要手动编写代理类。代理类需要实现与被代理类相同的接口,并且在代理类中持有一个被...
静态代理设计模式1.1 静态代理 – 实现步骤1.2 静态代理 – 逻辑图 & 源码示例1.3 静态代理 – 优缺2. 装饰者设计模式 – 类似静态代理2.1 装饰者模式 – 实现步骤2.2 装饰者模式 – 逻辑图 & 源码示例2.3 装饰者...
静态代理和动态代理简单实现代码.Proxy.其中静态代理我写了两个demo,有一个是最原始的,还有一个放在程杰的大化设计模式的代理模式写的,纯属娱乐。
java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...
单例设计模式案例演示 单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,**应用该模式的这个类只有一个实例**。即一个类只有一个对象实例。 #### 单例设计模式实现步骤 1. 将构造方法私有化,使其...
代理模式:是一种设计模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象。如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目标对象功能...
代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个...