代理模式分为静态代理和动态代理
下面我分别举例静态代理和动态代理的实例以及如何使用代理模式实现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();
}
}
}
分享到:
相关推荐
在Spring AOP中,我们通常使用@Aspect注解来定义切面类。切面类中可以包含多个通知(Advice),包括前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知...
在Spring AOP中,`Proxy`类会根据目标对象的接口生成一个代理类,这个代理类会实现目标对象的所有接口,并在每个方法调用前后插入相应的通知。`InvocationHandler`接口定义了一个`invoke`方法,当调用代理对象的方法...
在本章中,我们将探讨17种设计模式在Spring AOP中的应用和实现,以及它们如何帮助提升软件的可维护性和扩展性。 1. **抽象工厂模式(Abstract Factory)**:Spring AOP框架中的`AopProxyFactory`接口代表抽象工厂,...
Spring AOP中的切面(Aspect)是一个封装了多个相关通知(Advice,即切面逻辑)的组件。通知可以是在方法执行前、后、异常发生时,甚至是环绕方法执行的逻辑。通过定义切入点(Pointcut),我们可以精确地指定何时、...
在Spring框架中,我们可以利用AOP和代理模式来创建日志拦截器,从而实现对程序执行过程的记录。拦截器会在方法调用前后执行特定操作,例如在方法执行前记录开始时间,在方法执行后记录结束时间和执行结果,以及可能...
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
在Day01_AutoAOP的学习资料中,你可能将深入理解Spring AOP的原理,实践自动代理的配置,并通过示例代码体验如何使用AOP进行日志记录、事务管理和权限控制等功能。这将有助于提升你在JavaEE开发中的能力,使你的代码...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...
在Spring框架中,AOP是通过使用代理模式来实现的。 五、IOC(Inversion of Control) IOC是一种软件设计模式,旨在将对象的创建和管理从应用程序中分离出来。在Spring框架中,IOC容器负责创建和管理对象,并提供了...
**AOP(面向切面编程)设计模式** 面向切面编程(Aspect Oriented Programming,简称AOP)是一种软件设计模式,它将关注点分离到不同的模块,这些模块被称为切面,使得程序结构更加清晰,降低了模块间的耦合度。AOP...
在Spring AOP中,有两种主要的代理方式:JDK动态代理和CGLIB代理。JDK动态代理基于接口实现,而CGLIB代理则是在运行时动态生成目标类的子类。 首先,我们需要理解Spring Bean工厂。Bean工厂是Spring容器的核心,...
在Java中,动态代理可以用来实现AOP,通过 InvocationHandler接口提供一个执行处理器,然后通过Proxy类获取一个代理对象,通过这个代理对象来执行商业方法。在商业方法被调用时,执行处理器会被自动调用,从而实现了...
动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...
代理模式和 AOP 是软件开发中非常重要的概念和技术,它们可以帮助我们将非功能性需求与业务代码分离,提高代码的可维护性和可扩展性。Spring 提供了一个强大的 AOP 框架和 IoC 容器,可以帮助我们轻松实现代理模式和...
AOP代理是实现这一功能的关键机制。下面将详细解释Spring中的Aop代理。 1. AOP的基本概念: AOP的核心思想是将关注点分离,即将横切关注点(如日志、事务)与业务逻辑分离,使得代码更加模块化,易于维护。切面是...
代理模式的应用非常广泛,例如在AOP(面向切面编程)中,代理模式用于实现切面逻辑,如事务管理、性能监控等。此外,还可以用于远程调用、安全控制、缓存等场景。 总结来说,Java设计模式中的代理模式提供了一种...
在Spring AOP中,代理模式使得我们可以在不修改原始业务逻辑的情况下,插入额外的逻辑,比如事务管理、日志记录等。 代理模式主要有两种形式:静态代理和动态代理。 1. **静态代理** 静态代理在程序运行前就已经...
代理模式是设计模式的一种,它的主要目的是在不改变原有对象的基础上,为一个对象提供额外的功能或者控制对这个对象的访问。在Android开发中,代理模式的应用尤为常见,尤其在处理复杂的业务逻辑、网络请求、界面...