我对代理模式的理解就是,对于类中的方法进行拦截的一种方式,Spring的AOP就是靠这个模式玩的。
下面纪录一个例子,对ArrayList代理,要求是对于ArrayList的add方法进行处理,在add执行前,打印一个信息,add执行后,打印add的元素的内容,最后打印add完成的信息.
定义一个ArrayListProxy的代理类, 引用一个ArrayList的实例, 然后利用这个实例去复写ArrayList所有的方法,对其中的add方法做一些处理.
这样以后直接用ArrayListProxy这个类,他的add方法就可以自动获得新的处理,而其他方法不变,通过这样的方式,把原来的ArrayList给代理了.
package com.design.study.proxy.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class ArrayListProxry<E> implements Collection<E> {
private ArrayList<E> al = new ArrayList<E>();
public boolean add(E e) {
System.out.println("Before Proxy arrayList!");
try{
System.out.println("add element:" + e);
return al.add(e);
}finally{
System.out.println("After Proxy arrayList!");
}
}
@Override
public boolean addAll(Collection<? extends E> c) {
return al.addAll(c);
}
@Override
public void clear() {
al.clear();
}
@Override
public boolean contains(Object o) {
return al.contains(o);
}
@Override
public boolean containsAll(Collection<?> c) {
return al.containsAll(c);
}
@Override
public boolean isEmpty() {
return al.isEmpty();
}
@Override
public Iterator<E> iterator() {
return al.iterator();
}
@Override
public boolean remove(Object o) {
return al.remove(o);
}
@Override
public boolean removeAll(Collection<?> c) {
return al.remove(c);
}
@Override
public boolean retainAll(Collection<?> c) {
return al.retainAll(c);
}
@Override
public int size() {
return al.size();
}
@Override
public Object[] toArray() {
return al.toArray();
}
@Override
public <T> T[] toArray(T[] a) {
return al.toArray(a);
}
}
执行代码:
package com.design.study.proxy.list;
import java.awt.Label;
import java.util.Collection;
public class Client {
@SuppressWarnings("unchecked")
public static void main(String[] args){
Collection l = new ArrayListProxry();
l.add("a");
l.add(new Label());
}
}
执行结果:
Before Proxy arrayList!
add element:a
After Proxy arrayList!
Before Proxy arrayList!
add element:java.awt.Label[label0,0,0,0x0,invalid,align=left,text=]
After Proxy arrayList!
不过,java的反射库里提供了一些类直接支持代理,我们可以直接利用, 下面我把上面的例子改成这样的方式,
package com.design.study.proxy.list;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
public class ArrayListProxy2<E> implements InvocationHandler{
private Object al;
private ArrayListProxy2 (Object l){
this.al = l;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object o = null;
if("add".equals(method.getName())){
System.out.println("Before Proxy arrayList!");
o = method.invoke(al, args);
System.out.println("add element:" + ((List)proxy).get(((List)proxy).size()-1));
System.out.println("After Proxy arrayList!");
}else{
o = method.invoke(al, args);
}
return o;
}
public static Object factory(Object obj){
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
new ArrayListProxy2(obj));
}
}
通过这种方式要代理一个类,必须继承InvocationHandler接口.并实现invoke方法,通过该方法的3个参数,可以对这个类里的任何方法进行拦截处理.
Object proxy -- 被代理的对象的实例,
Method method -- 被代理的对象的方法,
Object[] args -- 被代理的对象的方法的参数列表
执行代码:
package com.design.study.proxy.list;
import java.awt.Label;
import java.util.ArrayList;
import java.util.List;
public class Client {
@SuppressWarnings("unchecked")
public static void main(String[] args){
List l2 = (List<String>)ArrayListProxy2.factory(new ArrayList());
l2.add(new Label());
l2.add("b");
l2.add("c");
l2.add("d");
l2.add("e");
l2.add(new Label());
l2.remove(0);
l2.add(new Label());
}
}
执行结果:
Before Proxy arrayList!
add element:java.awt.Label[label0,0,0,0x0,invalid,align=left,text=]
After Proxy arrayList!
Before Proxy arrayList!
add element:b
After Proxy arrayList!
Before Proxy arrayList!
add element:c
After Proxy arrayList!
Before Proxy arrayList!
add element:d
After Proxy arrayList!
Before Proxy arrayList!
add element:e
After Proxy arrayList!
Before Proxy arrayList!
add element:java.awt.Label[label1,0,0,0x0,invalid,align=left,text=]
After Proxy arrayList!
Before Proxy arrayList!
add element:java.awt.Label[label2,0,0,0x0,invalid,align=left,text=]
After Proxy arrayList!
分享到:
相关推荐
这里我们聚焦于C#语言中的设计模式学习笔记,涵盖了多种经典的设计模式,如合成模式、桥梁模式、装饰模式、享元模式、门面模式、命令模式、工厂方法、策略模式、代理模式以及状态模式。下面将对这些模式逐一进行详细...
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在调用原始对象的方法之前或之后执行额外的操作。代理模式在软件工程中有多种应用,例如:增加安全控制、性能监控、事务管理等。...
结构型模式处理对象组合,比如适配器模式(Adapter)用于接口转换,装饰者模式(Decorator)允许在运行时动态地给对象添加新的行为或职责,以及代理模式(Proxy)提供一个代表对象来控制对原对象的访问。行为型模式...
代理模式分为静态代理和动态代理,其中动态代理在Java中可以通过InvocationHandler接口和Proxy类实现。 2. **单例模式**: 单例模式确保一个类只有一个实例,并提供全局访问点。这种模式常用于控制资源的共享,如...
最后,代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。Java中的动态代理机制,通过实现`InvocationHandler`接口,可以在运行时动态创建代理类。 这些设计模式都是Java开发中不可或缺的工具,它们...
在本篇Spring学习笔记中,我们将深入探讨动态代理模式,并结合Spring框架的实现进行分析演示。动态代理模式是Java编程中一种重要的设计模式,它允许我们在不修改原对象代码的情况下,为对象添加额外的功能或行为。...
代理模式(Proxy)** - **定义**:为其他对象提供一种代理以控制对这个对象的访问。 - **用途**:可以在不改变客户端代码的情况下增加额外的功能,如权限控制、缓存等。 - **示例**:在用户级别的授权机制中,可以...
结构型模式关注如何将类或对象组合成更大的结构,比如适配器(Adapter)、桥接(Bridge)、装饰(Decorator)、外观(Facade)、享元(Flyweight)、组合(Composite)和代理(Proxy)模式。例如,装饰模式允许动态...
结构型模式涉及如何组合类和对象以获得更大的结构,如代理模式(Proxy)、装饰模式(Decorator)和适配器模式(Adapter)。代理模式为其他对象提供一种代理以控制对这个对象的访问;装饰模式可以在不影响其他对象的...
5. **代理模式(Proxy Pattern)**:虽然未明确提及,但代理模式可以用于为对象提供一种代理以控制对这个对象的访问,这在需要添加额外功能或者控制访问权限时非常有用。例如,可能存在一个DuckProxy类,它作为Duck...
装饰模式(Decorator)可以在运行时动态地给对象添加新的行为或责任,而代理模式(Proxy)为其他对象提供一种代理以控制对这个对象的访问。 行为型模式关注对象之间的交互和职责分配。策略模式(Strategy)定义了一...
11. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。在远程调用、权限控制等方面有广泛应用。 12. 模板方法模式(Template Method):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。...
代理模式为其他对象提供一种代理以控制对这个对象的访问。Java中的动态代理机制,如java.lang.reflect.Proxy,可以方便地实现接口代理。 九、桥接模式 桥接模式将抽象部分与实现部分分离,使它们可以独立变化。这种...
在本篇Spring学习笔记中,我们将探讨静态代理模式在Spring框架中的应用与分析。静态代理是一种常见的设计模式,它在不修改目标类代码的情况下,通过代理类来扩展或增强目标类的功能。在Spring中,静态代理主要应用于...
7. 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 行为型模式涉及对象之间的责任分配,包括: 1. 责任链模式(Chain of Responsibility):将请求沿着处理者链传递,直到有对象处理为止。 2....
2. 结构型模式:包括适配器模式(Adapter)、桥接模式(Bridge)、装饰模式(Decorator)、组合模式(Composite)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)。它们处理对象之间的关系,如组合...
结构型模式涉及如何组合类和对象,比如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)。行为型模式则关注对象之间的交互,例如观察者模式(Observer)、策略模式(Strategy)和模板方法模式...
常见的有:适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)、代理(Proxy)。例如,适配器模式允许不兼容的接口之间进行通信,而组合模式则允许我们构建树形结构来...
- 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 - 外观模式(Facade):为子系统提供一个统一的接口,使得子系统更加易于使用。 - 适配器模式(Adapter):将一个类的接口转换成客户希望...