在业务对象执行某个方法时,在业务方法前和方法后均让操作者执行相应操作(切面编程), 操作者和业务者均面向接口编程,并在代理类中
实现解耦。即操作方法和业务方法的执行能够最大限度独立。
1. 先定义日志等级:
package boke.javamode.log;
/**
* 日志等级
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public enum Level {
INFO,WARN,DEBUG;
}
2. 日志类-可扩展
package boke.javamode.log;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日志
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class Logger {
public static void log(Level level, String logInfo) {
if (level.equals(Level.INFO)) {
System.out.println("Logger INFO : "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()) + " " + logInfo);
} else if (level.equals(Level.WARN)) {
System.out.println("Logger WARN : "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()) + " " + logInfo);
} else if (level.equals(Level.DEBUG)) {
System.out.println("Logger DEBUG : "
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(new Date()) + " " + logInfo);
}
}
}
3. 业务接口
package boke.javamode;
/**
* 业务接口
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public interface ISay {
void sayHello(String name);
void sayGoodBye(String name);
}
4. 业务对象
package boke.javamode;
/**
* 业务对象
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class Say implements ISay {
public void sayGoodBye(String name) {
System.out.println("GoodBye " + name);
}
public void sayHello(String name) {
System.out.println("Hello " + name);
}
}
5. 操作者接口
package boke.javamode;
import java.lang.reflect.Method;
/**
* 操作者接口
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public interface IOperationExecutor {
/**
* 方法执行之前的操作
*
* @param method
*/
void start(Method method);
/**
* 方法执行之前的操作
*
* @param method
*/
void end(Method method);
}
6. 操作者实现
package boke.javamode;
import java.lang.reflect.Method;
import boke.javamode.log.Level;
import boke.javamode.log.Logger;
/**
* 操作者实现
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class LoggerOperation implements IOperationExecutor {
public void end(Method method) {
Logger.log(Level.INFO, method.getName() + " method end...");
}
public void start(Method method) {
Logger.log(Level.INFO, method.getName() + " method start...");
}
}
7. 动态代理实现 - JDk提供的动态代理实现机制
package boke.javamode;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import boke.javamode.log.Level;
import boke.javamode.log.Logger;
/**
* 动态代理
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class DynamicProxySay implements InvocationHandler {
private Object proxyOperation; // 操作者对象
private Object proxyLogic; // 业务逻辑对象
/**
* 获得代理对象(业务逻辑)
*
* @param proxyOperation
* @param proxyLogic
* @return
*/
public Object getProxyObj(Object proxyOperation, Object proxyLogic) {
this.proxyOperation = proxyOperation;
this.proxyLogic = proxyLogic;
return Proxy.newProxyInstance(this.proxyLogic.getClass()
.getClassLoader(), this.proxyLogic.getClass().getInterfaces(),
this);
}
/**
* JVM动态调用
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object resultObj = null;
try {
Class operCls = this.proxyOperation.getClass();
Method start = operCls.getMethod("start",
new Class[] { Method.class });
// 反射执行start方法
start.invoke(proxyOperation, new Object[] { method });
// 执行业务逻辑对象
resultObj = method.invoke(proxyLogic, args);
Method end = operCls.getMethod("end", new Class[] { Method.class });
// 反射执行end方法
end.invoke(proxyOperation, new Object[] { method });
} catch (Exception e) {
e.printStackTrace();
}
return resultObj;
}
}
8. 客户端
package boke.javamode;
/**
* 客户端
*
* @since jdk1.6
* @author 毛正吉
* @version 1.0
* @date 2010.07.10
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
IOperationExecutor operExe = new LoggerOperation();
ISay say = new Say();
ISay proxySay = (ISay) new DynamicProxySay().getProxyObj(operExe, say);
proxySay.sayHello("Alice");
System.out.println();
proxySay.sayGoodBye("Bob");
}
}
// 输出:
Logger INFO : 2010-07-10 18:27:35 sayHello method start...
Hello Alice
Logger INFO : 2010-07-10 18:27:35 sayHello method end...
Logger INFO : 2010-07-10 18:27:35 sayGoodBye method start...
GoodBye Bob
Logger INFO : 2010-07-10 18:27:35 sayGoodBye method end...
分享到:
相关推荐
1.只需要在controller层增加自定义@RequestLog注解就可以实现了。 @RequestLog功能参数如下: 功能一:是否记录请求参数 功能二:是否记录请求日志 功能三:是否记录返回值 功能四:是否以debug形式记录 功能五:日志类型 ...
双同步解耦坐标系锁相环--DDSRFSPLL
电机双闭环控制最全动态解耦论文,是我看过讲动态解耦最详细的文章,完全能够解决电机控制中dq轴电流耦合的问题。
iOS容器框架,包括容器组件和路由组件,实现事件解耦和组件解耦。
对于MIMO系统进行PID解耦控制,并利用响应信号观察解耦效果。
利用MATLAB仿的基于电流旋转坐标系解耦的APF有源滤波器!
对感应电动机的解耦控制及矢量控制的解耦性质进行了研究.从感应电动机变频调速系统 的非线性模型出发,分别利用...能实现二者之间的动态解耦,而基于状态反馈线性化的解耦控制方法,能够实现转速与转子磁链之 间的动态解耦
1. 业务组件解耦,能够实现业务组件模块的热插拔 2. 更改产品迭代模式,可分为主App和次Apk(动态加载业务组件模块) 3. 改善产品更新过程,可以在不影响用户的情况下实现业务组件模块更新以及重要Bug修复 4. 减轻主...
该方法将系统输入变量间的耦合作用、被控对象参数时变和外界干扰视为一个总的扰动,用ESO估计该总扰动并反馈到控制器进行补偿,从而实现动态解耦;对解耦后的每个子系统,分别设计出了基于误差最小二乘指标的神经元...
基于matlab的解耦控制simulink仿真
通过自定义注解优雅实现策略模式解耦rocketmq的消息处理器
动态代理的目的是在不修改原始对象的情况下,对其方法调用进行控制和增强。通过代理对象,我们可以在方法调用前后插入附加逻辑,实现一些横切关注点的功能,如日志记录、权限验证、性能监控等。动态代理可以提供一种...
为什么选择DDD DDD和系统解耦 DDD和统一语言 总结
移动网关架构升级方案--泛化service解耦 - 架构升级。
业务代表模式(Business Delegate Pattern)用于对表示层和业务层解耦。它基本上是用来减少通信或对表示层代码中的业务层代码的远程查询功能。在业务层中我们有以下实体。 客户端(Client) - 表示层代码可以是 JSP...
介绍了EventBus的使用,包含四种回调函数的使用,对于实现组件的解耦很有帮助
本程序用于解耦控制的控制器设计以及函数计算
对于初学者来说,这篇论文可以很好地解决解耦问题
AS-i 数据解耦模块 DCM 1271[手册]pdf,
针对永磁同步电动机矢量控制中不能对定子电流d轴分量和q轴分量进行动态解耦的特点, 采用双PI动态解耦的方法, 避免了反馈解耦、对角矩阵解耦等方法中电机参数变化对解耦效果影响较大的问题, 以及逆系统方法、基于微分...