探讨问题的同胞们可以加QQ群:315309006
这里我首先想说的是面向过程、面向对象、面向切面不是什么高深的话题,写本文章的目的也只是为了让一些新人们更快的进入工作状态来。本文主要对上诉的几种开发思想进行阐述,仅代表本人想法,如有不对的地方请各位指正。
什么是面向过程(Procedure Oriented) 面向过程是一种以事件为中心的编程思想
在早期的计算机编程中是比较普遍
在程序规模不是很大时,具有优势,流程很清晰,容易组织
如果简单描述面向过程的话,面向过程就是算法加数据结构
举个例子:早晨起床去学校
1.睁眼
2.起床
3.穿衣服
4.洗漱
5.吃早餐
6.出门上学
从上面的几个动作,我们很容易的可以理解到为了完成“早晨起床去上学”这个目标,要分几步、顺序是什么、怎么达成目标的。
- 什么是面向对象(Object Oriented)
一般我们理解的面向对象都是OOP(面向对象编程)
广义点来说面向对象是一种解决问题的思路,包括OOA、OOD、OOP等(分析、设计、编程)
对象,一般来说具备有状态、有操作、有具体属性特点
还用上面“早晨起床去上学”的例子,如果要用面向对象的方式来表述,我们会怎么做呢?
class 人 {
string 姓名;
....
}
class 衣服 {
.......
}
class 食物 {
.......
}
class 洗涑用具 {
.......
}
class 床 {
.......
}
class 学生 extends 人 {
function 穿衣();
function 吃东西();
.....
}
呵,看到这里是不是有点头疼?要多写这么多代码啊?
面向对象的编程思想相对于面向过程来说被人们熟知并使用的时间要晚,面向对象在有限对象模型的系统中具备很强的编程优势,最让人兴奋的就是可复用性。打个比方说“下围棋”,如果用面向过程的思路写一个下围棋的程序,规则、对象都是被打散在整个程序中的,很可能明天的需求就是要加个“悔棋”,开发者面对这种需求唯一的心情就是------心里在滴血。
- 什么是面向切面(Aspect Oriented Programming)
面向切面通常被称作AOP(Aspect Oriented Programming)
AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果,面向切面我简单的用下面的图来做个演示:
// 通常我们在写Action程序的时候会继承或实现一个Action基类,如下所示:
public interface ActionSupport{
public void execute();
}
// 写Action程序的时候我们就会去实现这个方法
// (当然,也可以进一步封装成BasAction供其他Action进行继承)
public class XXXAction implement ActionSupport{
// extend basAction 的时候加@Override
public void execute() {
// 业务代码
System.out.println(“action execute”);
}
}
// 有了上面的一些类,那么如果我们希望在action执行的时候做一些before、after动作,接下来该怎么做呢?在定义一个拦截类:
public class XXXHandler implements InvocationHandler {
private Object proxyObj;
public Object bind(Object obj){
this.proxyObj=obj;
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),
this);
}
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
Object result=null;
try{
before();
result=method.invoke(proxyObj,args);
after();
} catch(Exception e){ /*异常处理*/ }
return result;
}
public void before() { System.out.println(“before action execute”); }
public void after() {System.out.println(“after action execute”); }
}
// 拦截类写好了,接着再定义一个工厂类,将拦截类交与代理,方便我们使用该拦截类:
public class AOPFactory{
private static Object getClassInstance(String clzName){
Object obj=null;
try{
Class cls=Class.forName(clzName);
obj=(Object)cls.newInstance();
}catch(ClassNotFoundException cnfe){ }
catch(Exception e){ }
return obj;
}
public static Object getAOPProxyedObject(String clzName){
Object proxy=null;
XXXHandler handler=new XXXHandler();
Object obj=getClassInstance(clzName);
if(obj!=null) {
proxy=handler.bind(obj);
} else {
System.out.println("Can't get the proxyobj");
}
return proxy;
}
}
// 验证代码:
public class ClientTest{
public static void main(String[] args){
ActionSupport act= (XXXAction)
AOPFactory.getAOPProxyedObject("XXXAction");
act.execute();
}
}
结果输出:
before action execute
action execute
after action execute
附: