快速制作网站,企业所得税优惠政策最新2023年100万以下,犀牛云做网站做网站需要多钱,电商培训视频教程当和朋友谈到AOP时#xff0c;第一映像会说AOP的应用层面#xff0c;比如拦截器、过滤器#xff0c;实现复用等等使用层面上。这些应用层面上的回答远远没有深入AOP的思想。是的#xff0c;AOP是思想#xff0c;面向切面思想。既然是编程思想#xff0c;那我们就有必要了… 当和朋友谈到AOP时第一映像会说AOP的应用层面比如拦截器、过滤器实现复用等等使用层面上。这些应用层面上的回答远远没有深入AOP的思想。是的AOP是思想面向切面思想。既然是编程思想那我们就有必要了解AOP的整个过程以及AOP思想出现的原因。AOP面向切面编程思想能够解决什么问题我们回顾一下编程思想的发展路线......早期的POP面向过程编程即是以功能为中心来进行思考和组织的一种编程方法强调的是功能。分析解决问题所需要的步骤然后用函数把这些步骤一一实现使用的时按顺序依次调用严格按照顺序侧重解决步骤着眼局部或具体。实际是一种单一的思考方式符合人类的思考方式是一种基础的方法从实际出发。它能够流程化编程任务只需要考虑实现方式和最终结果开发效率高代码短小精悍善于结合数据结构来开发高效率的程序明确流程步骤清楚便于节点分析。但是需要深入思考比较耗费精力代码复用性低不易扩展维护难度大且面向过程的模块化难度较高耦合度也高。由此可见随着时代发展面对的系统逐渐复杂一般的POP无法满足于是出现了OOP面向对象编程思想。需要说明的是并不是因为OOP的出现才使得POP没有余地或许有不少的伙伴甚至没听过POP。POP和OOP其实是一种互补关系相关复杂问题拆解之后还是会回归到面向过程的思想。OOP面向对象编程以对象为中心复杂系统出现时盛行的一种新型的程序设计思想。以对象模型为基础进行的抽象过程并在应用过程中描述自己的抽象概念定义包括对象、类、封装、继承等语法和概念。通常脱口而出“万物皆对象”它可以搭建大型的复杂的系统它是将数据抽象为模块结构然后必须存在某种方式来实现代码的多态执行最后它能压缩部分代码和函数。或许不是很好理解。举个例子比如说我们的系统是一个建筑那类/对象就是砖块砖块能够组成墙墙能构成房间房间组合在一起就组成了一栋建筑。这是不是和我们面向对象编程时是一样的一个模块由多个类共同实现模块又组成了某项服务多个服务构成了一个完整的系统。那么POP能够满足精简系统的开发OOP能够满足复杂的系统为什么还会出现AOP呢首先构建了一个系统之后依然会有需求的存在有了需求就会难免调整代码那么类就会发生变化如果大规模变化将是不现实的整个系统就会存在隐患以及人力物力的多余需求。类应该是固定的不应该频繁更改之所以出现了那么多的设计原则和设计模式目的就是针对不断的需求变化而进行拆解分离使我们的类能够像砖块一样固定从而让系统稳健。我们设计完一个系统之后新增需求要增加一个日志打印模块授权模块如果在各个模块都添加的话改动的工作量无疑是很大的存在的隐患也是很大的。从对象的组织角度来讲类是继承关系适合纵向扩展这也是OOP的思想。就像我们的建筑打好地基稳固之后纵向增加楼层是相对较方便的但是横向扩展是很困难的。因此面向对象设计有两个缺陷1.共性问题面向对象设计一般是纵向思维总会有一些共性不足。2.扩展问题当我们需要对现有的对象动态的新增某些行为或责任时就会变得比较困难。于是AOP出现了来弥补OOP的共性问题和扩展问题。当然AOP不是OOP的升级版是对OOP缺陷的补充。POPOOPAOP 这三种编程方式本质也是互相弥补从来不是哪个盛行而其他的就需要了。那么到底什么是AOP呢AOP面向切面编程切面就是横切关注点模块化OOP是使用类状态属性和行为模块化。类和接口组织的是针对横向关注点跨越应用程序的多个模块的功能需求。AOP涉及的应用例如日志记录、性能统计、安全控制异常处理。都是可以从业务代码中划分出来非业务逻辑的方法。AOP善于将公共的功能提取出来成立公共的模块只关注通用的功能不关注业务逻辑。AOP的优势1.将通用的功能从业务逻辑中抽离出来提高代码的复用性有利于后期的维护和扩展。2.在软件设计时抽出通用功能有利于软件设计的模块化降低架构的复杂度。AOP与 OOP所针对的目标是不同的。OOP针对业务处理过程的实体、属性行为进行抽象封装。AOP则是针对业务处理过程中切面进行提取就是面向对象过程中的某个步骤或阶段的提取来降低逻辑过程中各个部分的耦合。因此相比于OOP可以总结出AOP的特点。1.面向目标不同OOP面向名词AOP面向动词。2.思想结构不同OOP是纵向AOP是横向。3.注重方面不同OOP偏重业务逻辑单元划分AOP偏重业务处理过程中的某个步骤。那么我们在AOP应用层面的实现有两种常见的方式。静态代理AOP就是手写代码。我们以装饰器模式为例子装饰器就是在一个原有对象的情况下封装一个新的装饰器类来包装原有类提供额外的功能。//接口服务
public interface ITravelService
{Task PlanToTravel(Travel travel);
}
public class TravelService : ITravelService
{public Task PlanToTravel(Travel travel){Console.WriteLine($旅客{travel.name}成功加入旅行团);return Task.CompletedTask;}
}//装饰器
public class TravelDecorator : ITravelService
{private readonly ITravelService _travelService;public TravelDecorator(ITravelService travelService){_travelService travelService;}public async Task PlanToTravel(Travel travel){//旅行前await IsAllowToTravel(travel);await _travelService.PlanToTravel(travel);//旅行后await IsAllowBack(travel);}public Task IsAllowToTravel(Travel travel){Console.WriteLine($目前处于疫情严重将停止旅游!);return Task.CompletedTask;}public Task IsAllowBack(Travel travel){Console.WriteLine($返回目标地处于风控期暂时无法返航!);return Task.CompletedTask;}2.动态代理实现可以通过反射来实现。例如现有的AOP框架Romoting(分布式通讯框架)、Castle轻量级容器包含实现ORM、IOC、MVCAOP、UnityIOC容器AOP。以 Remoting和Castle 分别写一个实例如下//Remoting 例子
public class DynamicProxyT : DispatchProxy where T : class
{public T Target { get; set; }public DynamicProxy(){}//执行之前执行逻辑public Action BeforAction { get; set; }//执行之后执行逻辑public Action AfterAction { get; set; }public static T Decorate(T target, Action BeforAction, Action AfterAction){// DispatchProxy.Create creates proxy objectsvar proxy CreateT, DynamicProxyT() as DynamicProxyT;proxy.AfterAction AfterAction;proxy.BeforAction BeforAction;// If the proxy wraps an underlying object, it must be supplied after creating the proxy.proxy.Target target ?? Activator.CreateInstanceT();return proxy as T;}protected override object Invoke(MethodInfo targetMethod, object[] args){//执行业务之前的代码逻辑BeforAction();var result targetMethod.Invoke(Target, args);//执行业务之后的代码逻辑AfterAction();return result;}}//remoting 实例 使用方式
var tralvel new Travel{name 张三,date DateTime.Now,telphone 110,travel_target HangZhou};var service new TravelService();
var proxyService DynamicProxyITravelService.Decorate(service,() { Console.WriteLine(执行逻辑前); },() { Console.WriteLine(执行逻辑后); });proxyService.PlanToTravel(tralvel);//castle 实例
public class CastleProxyT : IInterceptor where T : class
{private static readonly ProxyGenerator _generator new ProxyGenerator();public T Target { get; set; }public CastleProxy(){}//执行之前public Action BeforAction { get; set; }//执行之后public Action AfterAction { get; set; }public static T Decorate(T target, Action BeforActions, Action AfterActions){var proxy target ! null ?_generator.CreateInterfaceProxyWithTarget(target, new CastleProxyT() {BeforAction BeforActions,AfterAction AfterActions }):_generator.CreateInterfaceProxyWithTargetT(Activator.CreateInstance(typeof(T)) as T,new CastleProxyT(){BeforAction BeforActions,AfterAction AfterActions});return proxy;}public void Intercept(IInvocation invocation){try{BeforAction();invocation.Proceed();//程序执行AfterAction();}catch (TargetInvocationException error){throw error.InnerException;}}
}//castle 实例 使用方式
var tralvel new Travel{name 张三,date DateTime.Now,telphone 110,travel_target HangZhou};var service new TravelService();
var proxyService CastleProxyITravelService.Decorate(service,() { Console.WriteLine(执行逻辑前); },() { Console.WriteLine(执行逻辑后); });proxyService.PlanToTravel(tralvel);好了以上就是AOP面向切面编程思想的内容了希望我讲解的内容能够帮到大家。 更多有趣内容请多关注