代理设计模式
定义:为其他对象提供一种代理以控制对这个对象的访问。
1.定义接口
package com.tuozq.demo.proxy;
/**
* @class Subject.java
* @author tuozq
* @date 2017年7月26日 上午9:34:30
* @descriptions
*/
public interface ISubject {
public void doSomething();
public void working();
}
2.添加接口的实现类
package com.tuozq.demo.proxy;
/**
* @class SubjectImpl.java
* @author tuozq
* @date 2017年7月26日 上午9:35:48
* @descriptions
*/
public class SubjectImpl implements ISubject {
@Override
public void doSomething() {
// TODO Auto-generated method stub
System.out.println("SubjectImpl : doSomething……");
}
@Override
public void working() {
// TODO Auto-generated method stub
System.out.println("SubjectImpl : working……");
}
}
3.动态代理 实现 InvocationHandler 接口 重写 invoke方法
package com.tuozq.demo.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import javax.naming.spi.DirStateFactory.Result;
/**
* @class SubjectProxyHandler.java
* @author tuozq
* @date 2017年7月26日 上午9:36:51
* @descriptions
*/
public class SubjectProxyHandler implements InvocationHandler {
//被代理对象
private Object proxyObj;
public SubjectProxyHandler( Object proxyObj )
{
this.proxyObj = proxyObj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println(method.getName() + " before……");
Object result = method.invoke(proxyObj, args);
System.out.println(method.getName() + " after……");
return result;
}
}
另一种实现方式
package com.tuozq.demo.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @class ProxyFactory.java
* @author tuozq
* @date 2017年7月28日 上午9:07:31
* @descriptions
*/
public class ProxyFactory {
public static Object getProxyInstance(final Object target){
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println(method.getName() + " before");
Object result = method.invoke(target, args);
System.out.println(method.getName() + " after");
return result;
}
});
}
}
4.运行测试
package com.tuozq.demo.proxy;
import java.lang.reflect.Proxy;
import javax.security.auth.Subject;
/**
* @class ProxyTest.java
* @author tuozq
* @date 2017年7月26日 上午9:40:35
* @descriptions
*/
public class ProxyTest {
public static void main(String[] args) {
SubjectImpl sub = new SubjectImpl();
ISubject Isub = (ISubject) Proxy.newProxyInstance(ISubject.class.getClassLoader(), new Class[]{ISubject.class}, new SubjectProxyHandler(sub));
Isub.working();
}
}