代理模式分为静态代理和动态代理
下面我分别举例静态代理和动态代理的实例以及如何使用代理模式实现AOP的功能
动态代理模式
下面我分别举例静态代理和动态代理的实例以及如何使用代理模式实现AOP的功能
动态代理模式
package com.fruitking.designparten.proxy.dproxy;
public interface Idea {
/**
* 表白
* @param condition
* @return
*/
public String tell(String condition);
/**
* 寄送礼品
* @param gift
* @return
*/
public String delivery(String gift);
}
package com.fruitking.designparten.proxy.dproxy;
public class HeroImpl implements Idea {
public String tell(String condition) {
System.out.println("××,我喜欢你,做我女朋友吧!");
String returnOfGirl = "";
if("有房".equals(condition)){
returnOfGirl = "可以";
}else if("月薪1万以上".equals(condition)){
returnOfGirl = "可以";
}else if("长得帅".equals(condition)){
returnOfGirl = "可以";
}else{
returnOfGirl = "去死吧,我怎么可能喜欢你呢,下辈子吧";
}
return returnOfGirl;
}
public String delivery(String gift){
System.out.println("××,送给你的情人节礼物!");
String returnOfGirl = "";
if("奔驰轿车".equals(gift)){
returnOfGirl = "亲爱的,我非常爱你";
}else if("大钻戒".equals(gift)){
returnOfGirl = "亲爱的,我很爱你";
}else if("铂金项链".equals(gift)){
returnOfGirl = "亲爱的,我爱你";
}else if("毛绒娃娃".equals(gift)){
returnOfGirl = "亲爱的,谢谢啦";
}else{
returnOfGirl = "谢谢啦,我要回家了,再见";
}
return returnOfGirl;
}
}
package com.fruitking.designparten.proxy.dproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class HeroProxy implements InvocationHandler {
private Idea hero;
public HeroProxy(){
}
public Idea bind(Idea obj){
this.hero = obj;
return (Idea)Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("代理人(女孩室友)去帮男主角转达/递送");
Object obj =method.invoke(this.hero, args);
System.out.println("代理人(女孩室友)已经帮男主角转达/递送");
return (String)obj;
}
}
package com.fruitking.designparten.proxy.dproxy;
public class Test {
public static void main(String[] args) {
Idea heroImpl = new HeroImpl();
HeroProxy heroProxy = new HeroProxy();
Idea idea = (Idea)heroProxy.bind(heroImpl);
String result = idea.tell("没有房子,月薪没有一万,长得不帅");
System.out.println(result);
System.out.println("-------------------------");
result = idea.tell("有房");
System.out.println(result);
System.out.println("-------------------------");
result = idea.delivery("大钻戒");
System.out.println(result);
System.out.println("-------------------------");
result = idea.delivery("爆米花");
System.out.println(result);
}
}