代理模式
使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法
1、静态代理
要求被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法
package com.proxy;
public class Proxy implements Move {
@Override
public void T() {
// TODO Auto-generated method stub
System.out.println("被代理类");
}
public static void main(String[] args) {
new MoveProxy(
new MoveProxyTwo(
new Proxy()
)
).T();
}
}
class MoveProxy implements Move{
Move move;
public MoveProxy(Move move) {
// TODO Auto-generated constructor stub
this.move=move;
}
@Override
public void T() {
System.out.println("MoveProxy代理开始...");
// TODO Auto-generated method stub
move.T();
System.out.println("MoveProxy代理结束...");
}
}
class MoveProxyTwo implements Move{
Move move;
public MoveProxyTwo(Proxy move) {
// TODO Auto-generated constructor stub
this.move=move;
}
@Override
public void T() {
// TODO Auto-generated method stub
System.out.println("MoveProxyTwo代理开始...");
move.T();
System.out.println("MoveProxyTwo代理结束...");
}
}
interface Move{
void T();
}
2、Java动态代理(内核:ASM)
package com.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class Proxy implements Move {
@Override
public void T() {
// TODO Auto-generated method stub
System.out.println("被代理类");
}
public static void main(String[] args) {
/*
new MoveProxy(
new MoveProxyTwo(
new Proxy()
)
).T();
*/
((Move)java.lang.reflect.Proxy.newProxyInstance(Proxy.class.getClassLoader(),new Class[] {Move.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("被代理类开始...");
Object ob= method.invoke(new Proxy(), args);
System.out.println("被代理类结束...");
return ob;
}
})).T();
((Move)java.lang.reflect.Proxy.newProxyInstance(Proxy.class.getClassLoader(),new Class[] {Move.class}, new NewProxy(new Proxy()))).T();
}
}
class NewProxy implements InvocationHandler{
Proxy proxyT;
public NewProxy(Proxy proxy) {
this.proxyT=proxy;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("被代理类开始...");
Object ob= method.invoke(proxyT, args);
System.out.println("被代理类结束...");
return ob;
};
}
class MoveProxy implements Move{
Move move;
public MoveProxy(Move move) {
// TODO Auto-generated constructor stub
this.move=move;
}
@Override
public void T() {
System.out.println("MoveProxy代理开始...");
// TODO Auto-generated method stub
move.T();
System.out.println("MoveProxy代理结束...");
}
}
class MoveProxyTwo implements Move{
Move move;
public MoveProxyTwo(Proxy move) {
// TODO Auto-generated constructor stub
this.move=move;
}
@Override
public void T() {
// TODO Auto-generated method stub
System.out.println("MoveProxyTwo代理开始...");
move.T();
System.out.println("MoveProxyTwo代理结束...");
}
}
interface Move{
void T();
}