面向过程、面向对象、面向切面|技术研究

探讨问题的同胞们可以加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

 附:

探讨问题的同胞们可以加QQ群:315309006

 

转载于:https://my.oschina.net/ehofy/blog/160558

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值