恋爱过程中的设计模式之代理模式(代理模式近似实现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();
}
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值