您的位置:首页 > 其它

20171030_chr_proxy 代理模式(动态代理)

2017-12-14 14:00 260 查看

代理模式(动态代理)

/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/Dog.java

package nuc.sw.dynamic.proxy;

public interface Dog {
public void info();
public void run();
public void cry();
}


/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/DogImpl.java

package nuc.sw.dynamic.proxy;

public class DogImpl implements Dog {

@Override
public void info() {
// TODO Auto-generated method stub
System.out.println("一只薛皮皮");
}

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("薛皮皮骑着Clearlove7的猪跑了");
}

@Override
public void cry() {
// TODO Auto-generated method stub
System.out.println("薛皮皮成为嚎哭深渊领主");
}

}


/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/MyInterceptor.java

package nuc.sw.dynamic.proxy;

public class MyInterceptor {
public void method1() {
System.out.println("模拟Struts框架中访问action之前拦截器执行的代码");
}
public void method2() {
System.out.println("模拟Struts框架中访问action之后拦截器执行的代码");
}
}


/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/MyProxyFactory.java

package nuc.sw.dynamic.proxy;

import java.lang.reflect.Proxy;

public class MyProxyFactory {
public static Object getProxy(Object object,String methodName) {
ProxyHandler handler=new ProxyHandler(object, methodName);
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), handler);
}
}


/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/ProxyHandler.java

package nuc.sw.dynamic.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxyHandler implements InvocationHandler {
private Object target;
private String methodName;
private MyInterceptor mi=new MyInterceptor();

public ProxyHandler(Object target,String methodName) {
this.target=target;
this.methodName=methodName;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub
Object result=null;
if(method.getName().equals(methodName)) {
mi.method1();
result=method.invoke(target, args);
mi.method2();
}else {
result=method.invoke(target, args);
}
return result;
}

}


/20171030_chr_proxy/src/nuc/sw/dynamic/proxy/TestDynamicProxy.java

package nuc.sw.dynamic.proxy;

import nuc.sw.proxy.*;

public class TestDynamicProxy {

public static void main(String[] args) {
// TODO Auto-generated method stub
//案例一:狗代理
//1.产生一个真实主题角色
Dog dog=new DogImpl();
//2.代理主题角色
Dog dogProxy=(Dog) MyProxyFactory.getProxy(dog, "info");
//3.通过代理主题角色访问真实主题角色方法
dogProxy.info();
dogProxy.run();
dogProxy.cry();

//案例二
BookAbstractSubject publisher=new Publisher();
BookAbstractSubject publisherProxy=(BookAbstractSubject)MyProxyFactory.getProxy(publisher, "saleBook");
publisherProxy.saleBook();
}

}


/20171030_chr_proxy/src/nuc/sw/proxy/BookAbstractSubject.java

package nuc.sw.proxy;

public interface BookAbstractSubject {
public void saleBook();
}


/20171030_chr_proxy/src/nuc/sw/proxy/Publisher.java

package nuc.sw.proxy;

public class Publisher implements BookAbstractSubject{
public void saleBook() {
// TODO Auto-generated method stub
System.out.println("真实主题角色出版社卖书");
}
public void makeBook() {
System.out.println("真实主题角色出版社造书");
}
}


/20171030_chr_proxy/src/nuc/sw/proxy/ShoppingOnline.java

package nuc.sw.proxy;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ShoppingOnline implements BookAbstractSubject{
private Publisher publisher=new Publisher();
public void presaleBook() {
// TODO Auto-generated method stub
System.out.println("代理主题角色网上商店买书前宣传");
}
public void postsaleBook() {
System.out.println("代理主题角色网上商店卖书后售后服务");
}
public void saleBook() {
// TODO Auto-generated method stub
/*this.presaleBook();
publisher.saleBook();
this.postsaleBook();
publisher.makeBook();*/
this.invoke();
}
//获取真实主题角色的所有方法,如果方法名为saleBook,完成上面的活儿,否则不管(反射机制)
public void invoke() {
Method[] methods=publisher.getClass().getMethods();
for(int i=0;i<methods.length;i++) {
try {
if(methods[i].getName().equals("saleBook")) {
this.presaleBook();
methods[i].invoke(publisher);
this.postsaleBook();
}else {
methods[i].invoke(publisher);
}
}
catch (IllegalAccessException e) {
}
catch (IllegalArgumentException e) {
}
catch (InvocationTargetException e) {
}
}
}
}


/20171030_chr_proxy/src/nuc/sw/proxy/TextProxy.java

package nuc.sw.proxy;

public class TextProxy {

public static void main(String[] args) {
// TODO Auto-generated method stub
ShoppingOnline so=new ShoppingOnline();
//so.saleBook();
so.invoke();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: