您现在的位置是:首页 >  云笔记 >  开发笔记 >  文章详情

面向对象OOP、面向切面AOP和面向过程POP编程的区别?

豆豆   2022-06-08 16:02:38   179人已围观

第一、面向过程编程(POP:Procedure Oriented Programming)

          面向过程编程POP:是一种以过程为中心的编程思想,是以什么正在发生为主要目标进行编程。“面向过程”也可称之为“面向记录”编程思想,这些都是以什么正在发生为主要目标进行编程,不同于面向对象的是谁在受影响。他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。简单来说:面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;

         例如用POP编程思想解决:把大象装进冰箱 ,它的编程处理如下:

image.png

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

第二、面向对象编程(OOP:Object Oriented Programming)

          面向对象OOP:是一种以事务为中心的编程思想,面向对象编程就是按现实业务一样的方式将程序代码按一个个对象进行组织和编写,让计算机系统能够识别和理解用对象方式组织和编写的程序代码,这样就可以把现实生活中的业务对象映射到计算机系统中。面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。

         同样举例用OOP编程思想解决:把大象装进冰箱 ,(其实这里有2种对象设计,可以设计一个超大的冰箱把大象塞进去,或者设计一个超小的大象塞进去)它的编程处理如下:

image.png

特性:抽象 封装 继承 多态

优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护

缺点:性能比面向过程低

第三、面向切面编程(AOP:Aspect Oriented Programming)

          面向切面AOP:通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。是OOP的延续。利用AOP可以在不改变类的属性前提下对业务逻辑的各个部分进行隔离,从而使业务逻辑层各部分之间的耦合度降低,提高程序的重用性,同时提高了开发的效率。常见的应用场景例如Spring框架中的切面和切点。比如日志记录、事物管理,性能统计,安全验证等。

          1、场景的AOP通知(增强)类型

-befor(前置通知):在方法开始执行前执行  
-after(后置通知):在方法执行后执行
-afterReturning(返回后通知):在方法返回后执行
-afterThrowing(异常通知):在抛出异常时执行
-around(环绕通知):在方法执行前和执行后都会执行

方法间的执行顺序:
around>before>around>after>afterReturning

配置表达式:
1)execution(public * *(..))——表示匹配所有public方法
2)execution(* set*(..))——表示所有以“set”开头的方法
3)execution(* com.xx.service.AccountService.*(..))——表示匹配所有AccountService接口的方法
4)execution(* com.xx.service.*.*(..))——表示匹配service包下所有的方法
5)execution(* com.xx.service..*.*(..))——表示匹配service包和它的子包下的方法

       2、Spring 事物AOP配置

	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="*" propagation="SUPPORTS" read-only="true" rollback-for="Exception,RuntimeException"/>
			<tx:method name="readOnly*" read-only="true"/>
			<tx:method name="notSupported*" propagation="NOT_SUPPORTED"/>
			<tx:method name="create*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/>
			<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/>
			<tx:method name="modify*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/>
			<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/>
			<tx:method name="remove*" propagation="REQUIRED" rollback-for="Exception,RuntimeException"/>
		</tx:attributes>
	</tx:advice>
	<aop:config>
		<aop:pointcut id="managerOperation"
			expression="execution(* com.xx.*.*.manager.*.*.*(..))" />
		<aop:pointcut id="serviceOperation"
			expression="execution(* com.xx.*.*.service.*.*(..))" />
			<aop:pointcut id="handlerOperation"
			expression="execution(* com.xx.*.*.handler.*.*(..))" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="managerOperation"  order="2"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"  order="2"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="handlerOperation"  order="2"/>
	</aop:config>
	<aop:aspectj-autoproxy proxy-target-class="true"/>

优点:

AOP将面向对象过程中,一些业务中重复(相同)的部分截取出来,并将它放在一个独立的类里,这样就大大减少了面向对象过程中重复的运行负载,且独立出来的这个类仍然可以掌控全局(执行原有的职责),有利于复用及软件的维护。




分享到:

编辑发布时间:2022-06-08 16:02:38