代理模式分为静态代理和动态代理
下面我分别举例静态代理和动态代理的实例以及如何使用代理模式实现AOP的功能
模拟实现AOP功能
下面我分别举例静态代理和动态代理的实例以及如何使用代理模式实现AOP的功能
模拟实现AOP功能
package com.fruitking.designparten.proxy.aopsimulate;
public interface Appointment {
/**
* 共度晚餐
* @param address
* @return
*/
public String eat(String address);
/**
* 看电影
* @param movie
* @return
*/
public String seeMovie(String movie);
/**
* 散步
*/
public void walk();
}
package com.fruitking.designparten.proxy.aopsimulate;
public class HeroImpl implements Appointment {
public String eat(String address) {
System.out.println("和女朋友一起吃饭...");
String result = "";
if("全聚德".equals(address)){
result = "开心,火辣";
}else if("楼外楼".equals(address)){
result = "开心,很满足";
}else if("外婆家".equals(address)){
result = "开心,温馨";
}else if("快餐店".equals(address)){
result = "平静";
}else{
result = "无所谓";
}
return result;
}
public String seeMovie(String movie) {
System.out.println("和女朋友一起看电影...");
String result = "";
if("泰坦尼克号".equals(movie)){
result = "特别感动,以至流泪";
}else if("非诚无扰".equals(movie)){
result = "搞笑浪漫";
}else{
result = "惊恐";
}
return result;
}
public void walk() {
System.out.println("和女朋友一起散步...");
}
}
package com.fruitking.designparten.proxy.aopsimulate;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HeroProxy implements InvocationHandler {
private Appointment appointmentObj;
private Appendix appendixObj;
public HeroProxy(){
}
public Appointment bind(Appointment appointmentObj,Appendix appendixObj){
this.appointmentObj = appointmentObj;
this.appendixObj = appendixObj;
return (Appointment)Proxy.newProxyInstance(appointmentObj.getClass().getClassLoader(),appointmentObj.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
//反射得到操作者的实例
Class<? extends Appendix> clazz = this.appendixObj.getClass();
//反射得到操作者的prepare方法
Method prepare = clazz.getDeclaredMethod("prepare",new Class[] {});
//反射执行prepare方法
prepare.invoke(this.appendixObj,new Object[]{});
Object obj = method.invoke(this.appointmentObj, args);
//反射得到操作者的end方法
Method endOfAppointment = clazz.getDeclaredMethod("endOfAppointment",new Class[] {});
//反射执行endOfAppointment方法
endOfAppointment.invoke(this.appendixObj,new Object[]{});
return (String)obj;
}
}
package com.fruitking.designparten.proxy.aopsimulate;
public interface Appendix {
/**
* 约会女友前的准备工作
*/
public void prepare();
/**
* 约会结束后的事情处理
*/
public void endOfAppointment();
}
package com.fruitking.designparten.proxy.aopsimulate;
public class AppendixImpl implements Appendix {
public void prepare() {
System.out.println("换帅气衣服,梳理发型,带上钱包");
}
public void endOfAppointment(){
System.out.println("送她回家,拥抱一下告别,看着她上楼");
}
}
package com.fruitking.designparten.proxy.aopsimulate;
public class Test {
public static void main(String[] args) {
try{
Appointment appointmentImpl = new HeroImpl();
Appendix appendixImpl = new AppendixImpl();
HeroProxy heroProxy = new HeroProxy();
Appointment appointment = (Appointment)heroProxy.bind(appointmentImpl,appendixImpl);
String result = appointment.eat("外婆家");
System.out.println(result);
System.out.println("-------------------------");
result = appointment.seeMovie("非诚无扰");
System.out.println(result);
System.out.println("-------------------------");
appointment.walk();
}catch(Exception e){
e.printStackTrace();
}
}
}